正则表达式:如何制作条件正则表达式

时间:2011-08-19 13:02:59

标签: c# regex match conditional-statements

我的正则表达式有以下条件: 当字符串不为空时,它应包含单词“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 个答案:

答案 0 :(得分:2)

既然你提到了C#,你可以试试这个:

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

它很有效,很简单。

答案 1 :(得分:1)

您可以尝试(^$)|(^.*linktype=\"internal\".*$)

空字符串或带有文本linktype="internal"的字符串。

答案 2 :(得分:1)

在这种特殊情况下,您可以使用:

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

否则,分别为每个案例编写一个正则表达式然后将它们括在括号中并使用'或'将它们包含在单个表达式中更容易:

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

这将匹配^$^.*linktype=['"]internal['"].*$

答案 3 :(得分:0)

这样的东西
(^$)|(^.*linktype=\"internal\".*$)

- 托马斯

答案 4 :(得分:0)

这样的事情应该这样做:

^.*linktype='(internal|)'.*$

答案 5 :(得分:0)

"<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')

答案 6 :(得分:0)

也许我应该添加自己的答案。到目前为止,答案使用的捕获组略高一些。要对非捕获组使用“或”条件:

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

第二部分不需要锚点,因为RE的定义将匹配字符串中没有锚点的任何地方。

此外,要在RE中使用“和”条件,您只需将规则连接在一起即可。这就是上面的RE实际形成的方式。它是(锚点开始和锚点结束)或(l AND in ... AND字符集['“]和i AND ...等...)

答案 7 :(得分:0)

string regex = "^(?:\\n|.*linktype=([\'\"])internal\\1.*\\n)";
var options = RegexOptions.Multiline);
var reg = new Regex(regex, options);