Как предотвратить регулярное выражение при первом совпадении альтернатив? - PullRequest
1 голос
/ 05 мая 2010

Если у меня есть строка hello world, как я могу изменить регулярное выражение world|wo|w, чтобы оно совпадало со всеми "world", "wo" и "w", а не только с одним первым совпадением "world" что доходит?

Если это невозможно напрямую, есть ли хороший обходной путь? Я использую C #, если это имеет значение:

Regex testRegex = new Regex("world|wo|w");
MatchCollection theMatches = testRegex.Matches("hello world");
foreach (Match thisMatch in theMatches)
{
   ...
}

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

Я думаю, вам нужно использовать три отдельных регулярных выражения и сопоставлять их с каждым из них. Когда вы указываете альтернативы, он считает каждое из них успешным совпадением и перестает искать соответствие одному из них. Единственный способ сделать это - повторить поиск с каждой из ваших альтернатив в отдельном регулярном выражении. Вы можете создать массив или список элементов Match и добавить каждый поиск в список, если вы хотите иметь возможность просматривать их позже.

1 голос
/ 05 мая 2010

Как писал SLaks, регулярное выражение не может соответствовать одному и тому же тексту более одного раза.

Вы могли бы "подделать это" так:

\b(w)((?<=w)o)?((?<=wo)rld)?

будет соответствовать w, o, только если ему предшествует w*, и rld, только если ему предшествует wo.

Конечно, на самом деле будут совпадать только части слова, но вы увидите, совпадают ли только первая, первые две или все части, посмотрев на захваченные группы.

Таким образом, в слове want будет совпадать w (остальное необязательно, поэтому регулярное выражение сообщает об общем успехе.

В work совпадет wo; \1 будет содержать w, а \2 будет содержать o. rld не удастся, но поскольку это необязательно, регулярное выражение по-прежнему сообщает об успехе.

Я добавил привязку границы слова \b к началу регулярного выражения, чтобы избежать совпадений в середине таких слов, как reword; если не хотите исключать эти совпадения, отбросьте \b.


* (?<=w) здесь на самом деле не нужен, но я сохранил его для согласованности.

1 голос
/ 05 мая 2010

Если вы пытаетесь сопоставить (начало) слова world три раза, вам нужно использовать три отдельных объекта Regex; одно регулярное выражение не может совпадать с одним и тем же символом дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...