[英]Regular expressions : How to make a conditional regex
我的正则表达式有以下条件:当字符串不为空时,它应包含单词“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\"|^$)
有人可以帮忙吗?
既然你提到了C#,你不妨试试这个:
if(str.Length == 0 || str.Contains("internal"))
它有效,而且很简单。
你可以尝试(^$)|(^.*linktype=\\"internal\\".*$)
空字符串或文本linktype="internal"
的字符串。
在这种特殊情况下,您可以使用:
^(.*linktype=['"]internal['"].*)?$
否则,分别为每个案例编写一个正则表达式然后将它们括在括号中并使用'或'将它们包含在单个表达式中更容易:
(^$)|(^.*linktype=['"]internal['"].*$)
这将匹配^$
或^.*linktype=['"]internal['"].*$
。
怎么样的
(^$)|(^.*linktype=\"internal\".*$)
--Tomas
这样的事情应该这样做:
^.*linktype='(internal|)'.*$
"<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')
也许我应该添加自己的答案。 到目前为止,答案使用的捕获组略高一些。 要对非捕获组使用“或”条件:
(?:^$)|(?:linktype=['\"]internal['\"])
在第二部分上不需要锚点,因为根据定义,RE将匹配字符串中的任何地方而没有锚点。
此外,要在RE中使用“和”条件,您只需将规则连接在一起即可。 这就是上面的RE实际形成的方式。 它是(锚开始和结束锚)OR(一l
与i
AND n
... AND字符集['“] AND i
AND ...等...)
string regex = "^(?:\\n|.*linktype=([\'\"])internal\\1.*\\n)";
var options = RegexOptions.Multiline);
var reg = new Regex(regex, options);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.