2011-08-19 117 views
3

我有我的正则表达式以下条件: 当字符串不为空,应该包含单词“内部”正则表达式:如何使有条件的正则表达式

所以,换句话说:

"<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\"|^$) 

谁能帮助?

+0

是否需要做正则表达式? – luketorjussen

+0

是的,它是该软件包中唯一可能的方法 –

+0

您正在使用C#,您可以像@Vache所建议的那样轻松完成 – luketorjussen

回答

1

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

无论是空字符串,或与文本linktype="internal"的字符串。

+0

这可能对我来说足够好,但我仍然想知道应该如何做一个条件表达式和表达式。 –

+0

这是一个有条件('|'是一个“或”),但也使用捕获,这需要RE做更多的工作。你可能想要一个非捕获组(即以'(?:'而不是'(')开始),如果字符串必须在任何地方包含“内部”检查,则不需要第二组中的锚:'(?:^ $)|(?:linktype = \“internal \”)' –

+0

另外,如果“linktype”可能有双引号或单引号,那么您必须再次修改;第二组:“(?:linktype = ['\“] internal ['\”])'。 –

2

既然你提到C#,你不妨试试这个:

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

它的工作原理,它的简单。

+0

如果没有正则表达式答案出现,我必须做类似于通过将它耦合到我的项目,但我猜正则化应该是由此。 –

+2

哦,你可以用正则表达式,但你必须问自己,如果你应该;) – Vache

+0

@Vache,我完全同意: - )像正则表达式一样强大,哟你还需要看看你的代码的可读性。我可以看看这个答案,并确切知道它做了什么,这不是正则表达式答案的情况。 – luketorjussen

0

关于类似

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

--Tomas

0

这样的事情应该这样做:

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

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

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

否则,很容易分开写每种情况下的正则表达式,然后附上它们在括号中并使用'或'将它们包括在单个表达式中:

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

这将m无论是^$还是^.*linktype=['"]internal['"].*$

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

如果LINKTYPE =“内部”匹配你并不真正关心的是什么之前和之后LINKTYPE =“内部”,你无论如何都会得到一个匹配:

(^$)|(linktype='internal') 
0

也许我应该添加我自己的答案。到目前为止的答案已经使用了成本稍高的捕获组。到与非捕获组使用的“或”条件:

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

无需用于对所述第二部分通过定义一个锚RE将在不锚定字符串内的任何位置相匹配。

此外,要在RE中使用“and”条件,只需将规则连接在一起即可。这就是上面的RE实际上是如何形成的。这是(锚开始和锚固端)OR(一lin ...和字符集['“]和i AND ...等...)

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