【问题标题】:Javascript Regex equivalent to PHP RegexJavascript 正则表达式等同于 PHP 正则表达式
【发布时间】:2016-09-01 08:34:35
【问题描述】:

我在 php 中寻找用下面的正则表达式突出显示单词的单词

/(?<!\\w)".$word."(?!\\w)/

我想要使用正则表达式在 javascript 中使用此正则表达式的准确输出。

任何人都可以建议上面的正则表达式的 javascript 正则表达式吗?

我想从实现的 JS 正则表达式中搜索匹配的单词的起始索引 - 结束索引。

【问题讨论】:

  • To highlight 表示您替换匹配项。在 JS 中,您需要使用捕获组而不是后视,并将内容插入回带有反向引用的结果中。
  • 我需要基于上述正则表达式的 javascript 实现的开始索引和结束索引。从上面的正则表达式中,单词来自服务器端,需要在客户端突出显示,我还需要保存它们的开始索引和结束索引。
  • 好。那么,你被困在哪里了?你对模式和代码做了什么?
  • 我无法从我的 javascript 正则表达式中找出这个正则表达式的确切输出: var regex = new RegExp('(?!
  • 我需要在上面的正则表达式中进行哪些更改?

标签: javascript php regex


【解决方案1】:

您可以使用\b(单词边界)标记like this 匹配单词。

var text = 'I want to match .word. all words that have .word. in them.';
var word = '.word.';
var regex = new RegExp('(' + escapeRegExp(word) + ')');

console.log(text.match(regex));

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

编辑:因 cmets 而更新。

【讨论】:

  • 这没有用:1)OP需要动态构建模式,2)如果.word.被传递,单词边界将不起作用。
  • 完全正确..这也会给查找带有特殊字符的单词带来问题。
  • 现在不做全字检查,外括号也不需要了。
  • 如果我正在搜索单词“.wor”,这将不起作用,然后它会返回 .word 之间的匹配项。在字符串中
  • @BhaveshTilvani 这正是您的 RegExp /(?&lt;!\\w)".$word."(?!\\w)/ 所做的。如果这不是您需要的,您能否在最初的问题中澄清更多?
【解决方案2】:

一个重要的注意事项:在 PHP 中,如果您使用 /u 修饰符,\w 可能会识别 Unicode,但由于您没有使用该 Unicode 模式,因此以下应该以相同的方式工作。

JS 正则表达式 not 根本不支持 lookbehinds。您需要将您的lookbehind 转换为一个捕获组,其中包含两种选择:字符串开头或非单词字符。

所以,你的构造函数看起来像

new RegExp('(^|\\W)(' + search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')(?!\\w)', 'g')

这是一个正则表达式演示:

var search = '.search.';
var rx = new RegExp('(^|\\W)(' + search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + ')(?!\\w)', 'g');
var s = ".search. .search.";
while ((m=rx.exec(s))!==null) {
  if (m[1]) {
     console.log(m.index+1, rx.lastIndex);
   } else { 
     console.log(m.index, rx.lastIndex);
   }
}
span.highlight {
  color: #FF0000;
 }

(^|\\W) 将匹配并捕获字符串的开头或非单词字符到第 1 组(使用替换模式中的 $1 反向引用引用),搜索单词使用 .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&amp;') 进行转义(以防万一有特殊字符,如.( 等)。搜索词被捕获到第 2 组。

支持前瞻的方式与 PHP 相同,因此您可以像在原始正则表达式中一样使用 (?!\\w)

m.index 将获取匹配开始位置,因此,我们需要检查第 1 组是否为空。如果不是,它匹配一个非单词符号,所以我们需要在使用前增加它。否则,只需使用普通的m.index。结束位置是RegExp.lastIndex 属性值。

【讨论】:

  • 我已经修改了问题。为最近的更改道歉。我想搜索这个词,想得到它的起始索引和结束索引。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2012-01-16
相关资源
最近更新 更多