Javascript Regex必须包含模式,但不能包含在字符串的末尾

时间:2018-02-22 19:07:25

标签: regex

我正在尝试过滤一些报告结果(Google Analytics - Javascript正则表达式支持),只包含包含模式“OA”的行,“OA”不能是字符串中的最后一个字符。我的下面的正则表达式解决了“字符串问题中的最后一个字符”,但不会将匹配仅限制在那些具有某些“OA”实例的行中。我应该包含另一个OR语句来捕获它,还是应该更新我当前的正则表达式来解释

E.g。文字(预期结果):

OA > OA //No Match
Paid Search > OA //No Match
Paid Search > (none) > Social //No Match
OA > Paid Search //Match
Social > OA > (none) > (none) //Match

正则表达式:

.{,2}$|.*[^OA]$

2 个答案:

答案 0 :(得分:1)

以下内容如何:

OA.(?!.*OA$)

它需要在OA之后另外匹配另一个char,因此它保证与最后一个OA实例不匹配;然后它明确地向前看以匹配字符串的结尾而不是OA

我不编写JavaScript代码,所以我不知道你的引擎是否支持。我在本地使用grep -P 'OA.(?!.*OA$)'使用grep进行测试,它适用于您的示例。

在拒绝否定前瞻的情况下,你可以说出实际上会有什么负面的预测:

(OA.*(O[^A]|[^O].)|OA.)$

这里的诀窍是想出一个完全否定OA的自动机。如果看到O,那么您不需要A,而是其他任何内容;否则,任何角色都可以接受。通过明确地在RE中制定它,您将生成我在上面提出的表达式的第一部分。

第二部分是填补空白的修复方法。因为第一部分要求匹配的字符串具有长度> = 4,第二部分关闭间隙以消除角部情况以强制匹配字符串的长度下降到> = 3,这实现了与负数相同的字符串集前瞻性实施。

答案 1 :(得分:0)

您可以匹配OA,然后确保该字符串不以OA结尾:

^.*OA.*(?:[^O]A|O[^A]|[^O][^A])$

那就匹配

^          # Begin of the string
.*OA       # match any character zero or more times and match OA
.*         # Match any characters zero or more times
(?:        # Non capturing group
  [^O]A    # Match not O and A
  |        # or
  O[^A]    # Match O and not A
  |        # or 
  [^O][^A] # Match not O not A
)          # Close non capturing group
$          # End of the string