【问题标题】:How to Locate a Character Between Alpha and Numeric Characters Using RegEx如何使用 RegEx 在字母和数字字符之间定位字符
【发布时间】:2019-10-02 16:14:29
【问题描述】:

我正在使用 Access VBA 并尝试替换出现在字母和数字字符之间的任何破折号(反之亦然)。我正在尝试使用正则表达式来定位破折号(并且只有破折号),如果它出现在字母和数字或数字和字母之间。

我能够找出语法来识别我正在寻找的模式 - 但是,表达式也选择了破折号前后的字符 - 我试图只匹配破折号。

/([0-9]-[A-Za-z])|([A-Z-a-z]-[0-9])/g

Actual Results:
1234-56789         nothing is matched
12-A458-125        2-A is matched
1-A-2-B-C985-ABC   1-A, A-2, 2-B,5-A are matched

我希望在这些情况下仅识别 - 字符

这可能吗?

谢谢!

【问题讨论】:

  • 可能是(?<=\d)-(?=[A-Za-z])|(?<=[A-Za-z])-(?=\d)
  • 谢谢。这完美无缺。但是,我应该补充一点,我正在尝试在 Access VBA 中使用它。它不喜欢积极向前看或向后看的特征。我将以此为起点进行修补……但如果您有任何其他想法,我们将不胜感激!谢谢!
  • 如果你解释一下你在做什么,我会有其他想法:替换、删除、提取?
  • 我编辑了问题以反映这一点 - 但我试图删除出现在字母和数字字符之间的任何破折号(反之亦然)。例如,我想让 12-A-B-92CD4-5 变成 12A-B92CD4-5。

标签: regex vba ms-access


【解决方案1】:

一般来说,识别字母和数字之间的连字符的模式对于同时支持后视和前瞻的正则表达式引擎是有效的

(?<=\d)-(?=[A-Za-z])|(?<=[A-Za-z])-(?=\d)

(?&lt;=\d) 是一个正向lookbehind,它匹配紧跟在数字前面的位置,(?&lt;=[A-Za-z]) 是匹配前面带有字母的位置的lookbehind,(?=[A-Za-z]) 正向lookahead 要求一个字母紧跟在当前位置和(?=\d) 需要一个数字。

要删除 VBA 代码中字母和数字之间的所有连字符,请使用

(\d)-(?=[A-Za-z])|([A-Za-z])-(?=\d)

替换为$1$2 作为替换字符串。

regex demo

正向lookbehinds 被捕获组替换,$1 / $2 占位符(替换反向引用)指的是存储在相应子匹配中的值。

您仍然需要前瞻来启用重叠匹配,幸运的是基于旧 ECMA 脚本版本的 VBA 正则表达式支持前瞻。

示例代码

Dim objRegExp As Object
Set objRegExp = CreateObject("vbscript.regexp")

objRegExp.Global = True
objRegExp.Pattern = "(\d)-(?=[A-Za-z])|([A-Za-z])-(?=\d)"
text = objRegExp.Replace(text, "$1$2")

【讨论】:

  • 这非常有效。非常感谢您的帮助和解释。现在这更有意义了。
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多