Javascript RegEx 匹配没有前后连字符的单词

Posted

技术标签:

【中文标题】Javascript RegEx 匹配没有前后连字符的单词【英文标题】:Javascript RegEx to match words without preceding or trailing hyphens 【发布时间】:2012-10-18 08:05:42 【问题描述】:

我需要一个用于 javascript 的 RegEx,它将匹配第 1-4 行中的字符串“smith”,但不匹配下面第 5-8 行中的字符串。 带编号的行是 Access 数据库中的字段(字段不包含数字)。 到目前为止我所拥有的是:

var xy = 'smith';
MyString = new RegExp('(^|\\W)' + xy + '(\\W|$)', 'i');

这与第 1-4 行中的 Smiths 以及第 7 行和第 8 行中的 Smiths 匹配。 如何让表达式也忽略前面或后面有连字符的 Smiths?

    史密斯、琼斯、威尔逊 史密斯·琼斯·威尔逊 琼斯、史密斯(小)、威尔逊 琼斯、威尔逊、史密斯 阿罗史密斯,琼斯 威尔逊,史密森 琼斯、史密斯-崔德斯通、威尔逊 威尔逊、布莱克利-史密斯、琼斯

经过一周和几十次尝试,我请教专家!

【问题讨论】:

当我在W之前写了两个斜线时,我在消息预览窗口中只看到了一个斜线。我必须写四个反斜杠才能在预览窗口中看到两个反斜杠。我点击了提交,却没有意识到最终显示与预览版本不对应。 我编辑了问题(以及相应的答案)以反映您的实际代码(使用正确数量的反斜杠)。 【参考方案1】:

自己编写否定字符类 (\W) 并包含连字符:

MyString = new RegExp('(^|[^a-z0-9_-])' + xy + '([^a-z0-9_-]|$)', 'i');

\W 匹配任何非单词字符(除了字母、数字和下划线之外的所有字符),[^a-z0-9_-] 匹配任何既不是单词字符也不是连字符的字符。

您当然可以在该字符类中使用\w

MyString = new RegExp('(^|[^\\w-])' + xy + '([^\\w-]|$)', 'i');

【讨论】:

谢谢,m.buettner,您的代码运行良好,尽管我很好奇为什么它不需要方括号中的 A-Z! ridgerunner,我正在使用你的建议,因为它更短更甜,但我必须在第二个 w 之前添加一个反斜杠。 :-) @user1781623,它不需要A-Z,因为末尾的i 表示“不区分大小写” @ridgerunner 我是这么认为的,但我不确定为什么 OPs 版本甚至会像他用这 4 个反斜杠描述的那样工作。 @m.buettner 我是 RegExp 的新手,不确定i 是指搜索的字符串还是条件,或两者兼而有之。例如。如果我想匹配前面有大写“A”或小写“x”的所有出现的“qwerty”(不区分大小写),那么我会感到困惑。诚然,这是一个牵强附会的例子。

以上是关于Javascript RegEx 匹配没有前后连字符的单词的主要内容,如果未能解决你的问题,请参考以下文章

Python regex如何在字母和数字之间插入连字符;并删除两个字母之间的连字符

RegEx(在 JavaScript 中查找/替换) - 匹配非字母数字字符但忽略 - 和 +

Javascript Regex - 查找所有可能的匹配项,即使在已经捕获的匹配项中

用于匹配正整数和负整数的 Javascript RegEx [重复]

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

正则表达式匹配在任意位置连字符并分成两行的特定单词