4

我认为这对你们很多人来说是一件简单的事情,但目前我对正则表达式的了解非常有限。我想匹配字符串中除两位数之外的所有内容。

例如:

测试22 KLO4567

量化宽松45 C2C

LOP 10 G7G400

现在我找到了匹配两位数的正则表达式:\d{2}

与以下内容匹配:

测试22 KLO4567

量化宽松45 C2C

LOP 10 G7G400

现在在我看来,将正则表达式转过来匹配除“\d{2}”之外的所有内容是相当容易的。我搜索了很多,但我似乎无法完成它。我希望这里有人可以提供帮助。

4

3 回答 3

2

这仅在您的正则表达式引擎支持后视时才有效:

^.+?(?=\d{2})|(?<=\d{2}).+$

解释:

|分隔两个匹配的情况:

  • ^.+?(?=\d{2})

这匹配从字符串 ( ^) 开始直到\d{2}遇到的所有内容。

  • (?<=\d{2}).+$

这匹配字符串的结尾,从两位数之后的位置开始。

如果您的正则表达式引擎不支持后视(例如 JavaScript),我认为不可能使用纯正则表达式解决方案。

您可以匹配第一部分:

^.+?(?=\d{2})

然后获取匹配结束的位置,将 2 添加到该数字,并从该索引中获取子字符串。

于 2018-05-23T07:51:30.490 回答
1

您是对的,拒绝在正则表达式中进行搜索通常是相当棘手的。

在你的情况下,我认为你想要[^\d{2}],但是,这很棘手,因为你的其他字符串也包含两位数字,所以你使用它的正则表达式不会选择它们。

我会使用这个正则表达式(使用PCRE 8.36但也应该在其他人中工作):

\*{2}\w*\*{2}

解释:

\*{2}.... 完全匹配“*”两次
\w* .... 匹配“单词字符”零次或无限次

于 2018-05-23T07:44:50.823 回答
0

找到一个非常简单的正则表达式:

^(.*?[^\d])\d{2}([^\d].*?)$

说明:

  • ^ : 匹配行首
  • (.*?[^\d]) :匹配并捕获两个数字之前的第一部分。它可以包含任何内容 (.*?) 但需要以不同于数字 ([^\d]) 的内容结尾,因此我们确保中间只有 2 个数字
  • \d{2} :是你自己找到的部分
  • ([^\d].*?) :是 (.*?[^\d]) 的对称:以不同于数字 ([^\d]) 的东西开头,然后匹配任何东西。
  • $ :直到行尾。

要测试此reges,您可以使用此链接

它将匹配第一次出现的两位数,但因为 OP 说只有一个它正确地完成了工作。我希望它可以与每个正则表达式引擎一起使用,因为没有使用太复杂的东西。

于 2018-05-23T09:15:38.763 回答