Регулярные выражения: как составить условное регулярное выражение - PullRequest
3 голосов
/ 19 августа 2011

У меня есть следующие условия для моего регулярного выражения: Если строка не пустая, она должна содержать слово «internal»

Итак, другими словами:

"<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK
"<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK
"test" --> NOK
"" --> OK

Я знаю, что пустую строку можно проверить с помощью: ^$
Или непустая строка с: ^\s*\S
и моя внутренняя проверка просто как: linktype=\'internal\' (например)

Собрать их вместе - трудная часть. Я застрял на этом, но он не работает, как ожидалось:

(?(?=^\s*\S)linktype=\"internal\"|^$)

Может кто-нибудь помочь?

Ответы [ 8 ]

2 голосов
/ 19 августа 2011

Поскольку вы упомянули C #, вы можете попробовать это:

if(str.Length == 0 || str.Contains("internal"))

Это работает, и это просто.

1 голос
/ 19 августа 2011

В этом конкретном случае вы можете использовать:

^(.*linktype=['"]internal['"].*)?$

В противном случае проще написать регулярное выражение для каждого случая отдельно, а затем заключить их в круглые скобки и использовать 'или', чтобы включить их в одно выражение:

(^$)|(^.*linktype=['"]internal['"].*$)

Это будет соответствовать либо ^$, либо ^.*linktype=['"]internal['"].*$.

1 голос
/ 19 августа 2011

Вы можете попробовать (^$)|(^.*linktype=\"internal\".*$)

Либо пустая строка, либо строка с текстом linktype="internal".

0 голосов
/ 03 января 2012
string regex = "^(?:\\n|.*linktype=([\'\"])internal\\1.*\\n)";
var options = RegexOptions.Multiline);
var reg = new Regex(regex, options);
0 голосов
/ 03 января 2012

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

(?:^$)|(?:linktype=['\"]internal['\"])

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

Кроме того, чтобы использовать условие «и» в RE, вы просто объединяете правила вместе. Так на самом деле формируется вышеупомянутое RE. Это (начало привязки И конец привязки) ИЛИ (l И i И n ... И набор символов ['"] И i И ... и т.д ...)

0 голосов
/ 19 августа 2011
"<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK
"<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK
"test" --> NOK
"" -->

Если сопоставлен linktype = 'internal', вам на самом деле не важно, что находится до и после linktype = 'internal', вы все равно получите совпадение:

(^$)|(linktype='internal')
0 голосов
/ 19 августа 2011

примерно так должно это сделать:

^.*linktype='(internal|)'.*$
0 голосов
/ 19 августа 2011

что-то вроде

(^$)|(^.*linktype=\"internal\".*$)

- Tomas

...