正则表达式:如何生成条件正则表达式

本文关键字:正则表达式 条件 何生成 | 更新日期: 2023-09-27 18:06:01

我的正则表达式有以下条件:当字符串不为空时,它应该包含单词"内部">

换句话说:

"<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'".*$)

--托马斯

"<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|)'.*$

也许我应该添加自己的答案。到目前为止,答案都是使用成本略高的捕获组。对非捕获组使用"或"条件:

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

第二部分上不需要锚,因为根据定义,RE将在没有锚的情况下匹配字符串中的任何位置。

此外,要在RE中使用"and"条件,只需将规则连接在一起即可。这就是上述RE的实际形成方式。它是(anchor start AND anchor end(OR(一个l AND i AND n…AND字符集['"]AND i AND……(

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