RegExp 匹配拼写未与指定大小写的单词匹配(如 \bOK\b,但仅匹配 oK、Ok 或 ok) [重复]

RegExp match a word NOT spelled with the case specified (like \bOK\b but would only match oK, Ok or ok) [duplicate]

提问人:Tommi Prami 提问时间:11/6/2023 最后编辑:AmigoJackTommi Prami 更新时间:11/13/2023 访问量:102

问:

我需要匹配不是以“标准”方式编写的单词/缩写,无论它是什么。

应该以这种方式与匹配类似:\bOK\b

Match here -> Ok
Match here -> oK
Match here -> ok
Would not match here -> OK

我有很多单词应该以这种方式检查,如果它长于几个字符添加,请检查不同情况的所有排列都非常大,非常快。

因此,寻找更优雅的解决方案,而不是为所有排列或常见的错误大小写制作正则表达式,如下所示:

(?-i)\bSaas\b
(?-i)\bsAAS\b
(?-i)\bSAAS\b
...

而不是仅仅将一个单词与我想找到的“SaaS”不同的大小写匹配(有点拼写错误)非标准大小写

正则表达式 PCRE

评论


答:

0赞 Christian Legge 11/6/2023 #1

这不是正则表达式本身无法解决的问题。您应该进行第二次检查,看看它是否与您不想要的东西相匹配。

// pseudocode
let pattern = "(SaaS)"

let match = regex.match(pattern, str, caseSensitive=false)

if (match && match.group(1) != "SaaS") {
    // the pattern matched a different way of spelling
}

评论

0赞 Tommi Prami 11/6/2023
好的,我希望在正则表达式中会有一些直接的方法,但肯定可以做你建议的事情。
4赞 Cary Swoveland 11/6/2023 #2

由于支持 PCRE,因此可以使用正则表达式

\b(?!OK)(?i)OK\b

演示

这之所以有效,是因为在执行否定展望之前不会生效(在我尝试之前我没有意识到这一点)。(?i)


正则表达式可以分解如下。

\b      match a word boundary
(?!OK)  a negative lookahead asserts that the next two characters not 'OK'
(?i)    match the remainder of the pattern with the case-indifferent flag set 
OK      match the literal 'OK', 'ok', 'Ok' or 'oK'
\b      match a word boundary

同样,你可以写

\b(?!SaaS)(?i)saas\b

当然可以写成

\b(?!SaaS)(?i)SaaS\b

\b(?!SaaS)(?i)sAAs\b

等等。

演示

评论

1赞 InSync 11/6/2023
(?i)也可以在本地应用:. 当然,不受它的影响,但如果未来的维护者要在正则表达式的末尾添加一些东西并且无法弄清楚为什么它不区分大小写,这可能会挽救未来的维护者。就像全局变量一样,修饰符更改如果不放在一开始,则其作用域应该受到限制。(?i:OK)\b
1赞 Cary Swoveland 11/6/2023
@InSync,好点子(我不知道的其他事情)。我看到也可以写成关闭内联大小写不区分。(?-i)
2赞 Casimir et Hippolyte 11/7/2023
变体:regex101.com/r/jMOmHi/2
0赞 Cary Swoveland 11/7/2023
@CasimiretHippolyte,不错。
0赞 Tommi Prami 11/7/2023
非常感谢大家。这使我的应用程序速度更快,因为它不必处理大量误报。运行时间:23,4539 秒 总规则在 3 023 个文件上运行 1 272 327 当我处理代码中的大小写差异并得到这些误报时,速度大约慢了 3-4 倍。