正则表达式-忽略与模式匹配的常量字符串

标签 regex excel vba

我有这个正则表达式:

\b[A-Z]{1}[A-Z]{0,7}[0-9]?\b|\b[0-9]{2,3}\b

所需的输出突出显示:

约翰在一个晴朗的日子去了伦敦。 约翰在一家PUB吃午餐。 约翰随后搬到了芝加哥。 我不想突出显示 JOHN。 约翰不希望它与模式匹配。 这个也没有。 但 THIS1 应该与模式匹配。 还有模式应匹配的其他 70 次。

观察到的输出:

JOHN 在一个晴朗的日子去了伦敦JOHN 在一家 PUB 吃午餐。 JOHN 随后搬到芝加哥I 不想突出显示 JOHN。 约翰不希望它与模式匹配。 这个也没有。 但 THIS1 应该与模式匹配。 还有模式应匹配的其他 70 次。

正则表达式可以部分工作,但我不希望两个常量字符串 - JOHNI 作为此正则表达式的一部分进行匹配。请帮忙。

最佳答案

您可以使用否定前瞻来排除这些匹配项。另外,您的模式看起来相当“冗余”,您可以使用分组和删除不必要的子模式来大大缩短它:

\b(?!(?:JOHN|I)\b)(?:[A-Z]{1,8}[0-9]?|[0-9]{2,3})\b
  ^^^^^^^^^^^^^^^^

请参阅regex demo

(?!(?:JOHN|I)\b) 是否定先行,如果匹配的单词等于 I,则匹配失败>约翰

请注意,{1} 始终可以省略,因为任何非量化模式都会匹配一次。 [A-Z]{1}[A-Z]{0,7} 实际上等于 [A-Z]{1,8}

图案详细信息:

  • \b - 字边界
  • (?!(?:JOHN|I)\b) - 匹配的单词不能等于 JOHNI<
  • (?:[A-Z]{1,8}[0-9]?|[0-9]{2,3}) - 两种选择之一:
    • [A-Z]{1,8}[0-9]? - 1 到 8 个大写 ASCII 字母,后跟可选的(1 或 0)数字
    • | - 或
    • [0-9]{2,3} - 2 到 3 位数字
  • \b - 尾随单词边界

关于正则表达式-忽略与模式匹配的常量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41483674/

相关文章:

excel - 取一个引用单元格,搜索第二张纸,用相同的标识符替换数据

arrays - 使用范围或数组进行的简单操作会产生不同的结果

c# - 正则表达式需要识别句子之间没有空格的地方

python - 在 Python 中将数学表达式字符串拆分为标记

mysql - 如何使用 Toad for MySQL 将阿拉伯语文本从 MySQL 数据库导出到 csv?

c# - 如何使用 C# 和 SDK 获取 OOXML 中的 'first' 工作表?

c# - 从引号中提取数据?

java - 使用正则表达式将第一个字符小写并空格下划线

vba - 如果从右上角关闭 Excel-VBA 表单的实例,则打开时会出现错误 红色 `X`

ms-access - 使用 Access VBA 更改窗体的记录源