Можно ли сохранить совпадение регулярных выражений и использовать его часть в качестве перечислителя списка?

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

]

1
задан nathanjw 13 July 2018 в 12:52
поделиться

3 ответа

Да, вы очень близки к вашей попытке с помощью 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)]);
2
ответ дан Dmitry Bychenko 17 August 2018 в 12:49
поделиться
  • 1
    Это то, что я имел в виду. Я не уверен, что делает match.Groups[1].Value? Откуда приходит 1? – nathanjw 13 July 2018 в 13:21
  • 2
    match.Groups[1].Value - значение первой группы захвата 0th - это полное совпадение, 1st соответствует скобке ([0-9]+). Вы можете явно указать : "%s(?<number>[0-9]+)", а затем Globals.Words[int.Parse(match.Groups["number"].Value)]); – Dmitry Bychenko 13 July 2018 в 13:23

Не прямой ответ на ваш вопрос о регулярных выражениях, но если я правильно вас понимаю, есть более простой способ сделать это:

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);

Обратите внимание, что вы не можете смешивать и сопоставлять два подхода.

4
ответ дан Flater 17 August 2018 в 12:49
поделиться
  • 1
    Да, это намного проще. – Rawling 13 July 2018 в 12:59
  • 2
    Да, это результат, который я искал. Я сделал что-то подобное, используя цикл for и string.replace. Вопрос состоял в том, чтобы попытаться помочь мне определить, могу ли я сделать то же самое с помощью регулярного выражения, как мне было предложено. Я не очень хорошо знаком с регулярным выражением, поэтому я подумал, что это может быть хорошим упражнением, пытаясь справиться с этим. – nathanjw 13 July 2018 в 13:05
  • 3
    @nathanjw: Regexes - мощный инструмент, и любая практика с ними полезна. Но я также узнал, что регулярные выражения действительно следует избегать, когда существуют более простые варианты, их трудно поддерживать или изменять. Разумеется, вы можете свободно решить эту проблему, но хотите иметь в виду, что использование регулярных выражений в качестве решения проблемы обычно является излишним, и вам лучше избегать их, когда существуют разумные альтернативы. – Flater 13 July 2018 в 13:07
  • 4
    Спасибо за совет по регулярному выражению, я буду помнить об этом. Я стараюсь избегать, когда это возможно. Как вы говорите, подход String.Format() намного проще и чище для моей цели здесь. – nathanjw 13 July 2018 в 13:22
  • 5
    После проверки этого я думаю, что я заменил цикл for на это, поскольку он более гибкий и позволяет мне форматировать входную строку лучше. Спасибо д – nathanjw 13 July 2018 в 13:37

Существует перегрузка Regex.Replace , которая вместо того, чтобы брать строку для последнего аргумента, принимает делегат MatchEvaluator - функцию, которая принимает объект Match и возвращает string.

Вы можете заставить эту функцию проанализировать целое число из свойства Match Groups[1].Value, а затем использовать его для индексации в свой список, возвращая найденный string.

0
ответ дан Rawling 17 August 2018 в 12:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: