module.exports
- это объект, который фактически возвращается в результате вызова require
.
Первоначально переменная exports
установлена на тот же объект (т. е. это сокращенный «псевдоним»), поэтому в коде модуля вы обычно пишете что-то вроде этого:
var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
для экспорта (или «раскрытия») функций с внутренним охватом myFunc1
и myFunc2
.
И в вызывающем коде вы должны использовать:
var m = require('./mymodule');
m.myFunc1();
, где последняя строка показывает, как результат require
является (обычно) просто обычным объектом, свойства которого могут
Примечание: если вы перезапишете exports
, то он больше не будет ссылаться на module.exports
. Поэтому, если вы хотите назначить новый объект (или ссылку на функцию) на exports
, вы также должны назначить этот новый объект module.exports
. Следует отметить, что имя добавлено в exports
объект не должен совпадать с внутренним облачным именем модуля для значения, которое вы добавляете, поэтому вы можете иметь:
var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
, за которым следует:
var m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
]
Да, вы очень близки к вашей попытке с помощью Regex.Replace
; последний шаг - изменить constant "wibble"
на lambda match => how_to_replace_the_match
:
var text = "Once upon a time there was a %s0 and it was %s1";
// Once upon a time there was a nathan and it was bob
var result = Regex.Replace(
text,
"%s([0-9]+)",
match => Globals.Words[int.Parse(match.Groups[1].Value)]);
Изменить: в случае, если вы не хотите работать с захватом групп по их номерам , вы можете назвать их явно :
// Once upon a time there was a nathan and it was bob
var result = Regex.Replace(
text,
"%s(?<number>[0-9]+)",
match => Globals.Words[int.Parse(match.Groups["number"].Value)]);
Не прямой ответ на ваш вопрос о регулярных выражениях, но если я правильно вас понимаю, есть более простой способ сделать это:
string baseString = "I have a {0} {1} in my {0} {2}.";
List<string> words = new List<string>() { "red", "cat", "hat" };
string outputString = String.Format(baseString, words.ToArray());
outputString
будет I have a red cat in my red hat.
.
Разве это не то, что вы хотите, или есть еще вопрос, который мне не хватает?
Незначительная разработка
String.Format
использует следующие Подпись:
string Format(string format, params object[] values)
В опциях params
есть что-то, что вы можете либо перечислить значения отдельно:
var a = String.Format("...", valueA, valueB, valueC);
, но вы также можете передать массив непосредственно:
var a = String.Format("...", valueArray);
Обратите внимание, что вы не можете смешивать и сопоставлять два подхода.
String.Format()
намного проще и чище для моей цели здесь.
– nathanjw
13 July 2018 в 13:22
Существует перегрузка Regex.Replace
, которая вместо того, чтобы брать строку для последнего аргумента, принимает делегат MatchEvaluator
- функцию, которая принимает объект Match
и возвращает string
.
Вы можете заставить эту функцию проанализировать целое число из свойства Match
Groups[1].Value
, а затем использовать его для индексации в свой список, возвращая найденный string
.
match.Groups[1].Value
? Откуда приходит 1? – nathanjw 13 July 2018 в 13:21match.Groups[1].Value
- значение первой группы захвата0th
- это полное совпадение,1st
соответствует скобке([0-9]+)
. Вы можете явно указать i>:"%s(?<number>[0-9]+)"
, а затемGlobals.Words[int.Parse(match.Groups["number"].Value)]);
– Dmitry Bychenko 13 July 2018 в 13:23