Анализ специального регулярного выражения - PullRequest
3 голосов
/ 24 февраля 2010

У меня есть регулярное выражение, которое выглядит примерно так:

a(|bc)

это выражение полностью соответствует строке "a", но не соответствует "abc". Что означает выражение в скобках?

Edit: Использование C # со следующим кодом:

Match m = Regex.Match(TxtTest.Text, TxtRegex.Text);
if (m.Success)
  RtfErgebnis.Text = m.Value;
else
  RtfErgebnis.Text = "Gültig, aber kein Match!";

«TxTTest» содержит строку для проверки (в данном случае «abc»). «TxtRegex» содержит регулярное выражение (в данном случае «a (| bc)»)

"RtfErgebnis" показывает "Gültig, aber kein Match!" Это означает, что регулярное выражение допустимо, но данная строка теста не совпадает.

На примечании стороны:

Выражение

a(|bc)d

соответствует «ad», а также «abcd». Так почему предыдущее выражение не соответствует «abc»?

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

Редактировать 2:

"RtfErgebnis" показывает "Gültig, aber kein" Match! ", Что означает, что регулярное выражение допустимо, но данная тестовая строка не матч.

У меня была небольшая ошибка на переданных параметрах, так что теперь он показывает "a", что совершенно верно.

Ответы [ 4 ]

5 голосов
/ 24 февраля 2010

Труба означает «или». Ваше первое выражение говорит: «а, затем ничто или вс ». Следовательно, «a» является полным соответствием, и не стоит включать «bc».

Второе выражение говорит: «а, затем ничего или вс , а затем d». В этой версии совпадение завершается только тогда, когда оно выбирает все до «d».

Если вы хотите, чтобы он предпочитал опцию "bc", а не опцию nothing , вы можете переписать выражение следующим образом:

a(bc)?

, что означает «a, за которым следует ноль или одно вхождение bc», и в этом случае большинство двигателей будут рассматривать «abc», а не «a», как полное совпадение.

3 голосов
/ 24 февраля 2010

Пустая ветвь в (|bc) соответствует чему-либо, но не использует символ, поскольку пустое выражение не описывает какой-либо символ.

Поменяйте местами ветки, и вы получите самый длинный матч:

a(bc|)

Это будет соответствовать abc в abc (bc занята ветвь), но также a в ax (пустая ветвь занята).

1 голос
/ 24 февраля 2010

То, возвращает ли (| ab) совпадение "" или "ab" для этой группы совпадений, зависит от порядка вашего совпадения и, вероятно, также зависит от используемого механизма регулярных выражений. Например, в grep и sed это соответствует ab, только если порядок обратный (ab |):

echo abc | sed -n 's/a\(\bc\|\)/\1/p'

Вышеуказанное возвращает:

bc

И следующее (| ab) ничего не возвращает:

echo abc | sed -n 's/a\(\\|bc\)/\1/p'
1 голос
/ 24 февраля 2010

На самом деле a (| bc) соответствует abc

perl -n -e 'print "Output:$_" if /a(|bc)/; '
a
Output:a
abc
Output:abc
bc

Поэтому между a (| bc) и a (| bc) d

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