用标点符号匹配整个字符串(使用 \b 的问题)
Match in whole string with punctuation (issues using \b)
通常为了匹配完整的单词我们使用\b
作为单词分隔符,但是当我们处理包含标点符号的复合世界时,这种方法就不太适用了。例如,假设以下字符串:
basic school co-operative limited
如果我们应用以下正则表达式,我们将按预期得到 co-operative
和 limited
。发生这种情况是由于交流发电机中的顺序:
\b(co-operative|co|co.|limited)\b
如果我无法控制正则表达式交流发电机的顺序并且我得到以下正则表达式会怎样?
\b(co|co.|co-operative|limited)\b
在这种情况下,只有 co limited
会匹配,而不是 co-operative limited
。有什么办法可以解决交替顺序的问题吗?
感谢您无价的帮助
由于您想要匹配完整的单词,您可以将正则表达式末尾的 \b
断言更改为对空格或字符串末尾的正向先行,例如
\b(co|co.|co-operative|limited)(?=\s|$)
如果您想在单词后使用某些标点符号,您可以将其添加到前瞻中,例如
\b(co|co.|co-operative|limited)(?=[\s.]|$)
如果可能,您可以尝试使用 ?-量词替换交替以捕获最长的版本:
\b(co(-operative)?.?|limited)\b
https://regex101.com/r/1D6BsU/1
不幸的是,这也将匹配 "co-operatives," 所以我们可以更明确一点来避免这种边缘情况:
\b(co(-operative(?=\b))?.?|limited)\b
通常为了匹配完整的单词我们使用\b
作为单词分隔符,但是当我们处理包含标点符号的复合世界时,这种方法就不太适用了。例如,假设以下字符串:
basic school co-operative limited
如果我们应用以下正则表达式,我们将按预期得到 co-operative
和 limited
。发生这种情况是由于交流发电机中的顺序:
\b(co-operative|co|co.|limited)\b
如果我无法控制正则表达式交流发电机的顺序并且我得到以下正则表达式会怎样?
\b(co|co.|co-operative|limited)\b
在这种情况下,只有 co limited
会匹配,而不是 co-operative limited
。有什么办法可以解决交替顺序的问题吗?
感谢您无价的帮助
由于您想要匹配完整的单词,您可以将正则表达式末尾的 \b
断言更改为对空格或字符串末尾的正向先行,例如
\b(co|co.|co-operative|limited)(?=\s|$)
如果您想在单词后使用某些标点符号,您可以将其添加到前瞻中,例如
\b(co|co.|co-operative|limited)(?=[\s.]|$)
如果可能,您可以尝试使用 ?-量词替换交替以捕获最长的版本:
\b(co(-operative)?.?|limited)\b
https://regex101.com/r/1D6BsU/1
不幸的是,这也将匹配 "co-operatives," 所以我们可以更明确一点来避免这种边缘情况:
\b(co(-operative(?=\b))?.?|limited)\b