如何匹配以美元符号开头而不是斜线美元的所有单词

时间:2016-09-19 18:09:53

标签: javascript regex

我希望匹配所有以美元符号开头而不是斜线和美元符号的单词。 我已经尝试了一些正则表达式。

allow write: if request.resource.size > 0

字符串

(?:(?!\\)\$\w+)

\\(\\?\$\w+)\b

预期结果

$10<i class="">$i01d</i>\$id

但不是这个

*$10*

*$i01d*

找到所有预期的匹配单词后,我想替换这个我的对象。

4 个答案:

答案 0 :(得分:1)

一种选择是先消除转义序列,然后匹配清理后的字符串:

s = String.raw`$10<i class="">$i01d</i>\$id`

found = s.replace(/\\./g, '').match(/\$\w+/g)

console.log(found)

答案 1 :(得分:0)

这里的一个大问题是你需要negative lookbehind,但JavaScript不支持它。可以粗略地模仿它,但我会提供一个替代方案,虽然不是很好,但仍然有效:

&#13;
&#13;
var input = '$10<i class="">$i01d</i>\\$id';
var regex = /\b\w+\b\$(?!\\)/g;

//sample implementation of a string reversal function. There are better implementations out there
function reverseString(string) {
  return string.split("").reverse().join("");
}

var reverseInput = reverseString(input);

var matches = reverseInput
  .match(regex)
  .map(reverseString);

console.log(matches);
&#13;
&#13;
&#13;

它不优雅,但它会完成这项工作。以下是它的工作原理:

JavaScript 支持支持超前表达式((?>))和负向前瞻((?!))。由于这与负面的后观相反,你可以反转字符串并反转正则表达式,它将完全匹配你想要的。由于所有匹配都将反转,您还需要将它们反转回原始匹配。

正如我所说,它并不优雅,因为它会进行大量的字符串操作,但它确实可以产生您想要的效果。

See this in action on Regex101

正则表达式解释通常情况下,&#34;匹配 x ,因为它之前没有 y &#34;将表示为(?<!y)x,因此在您的情况下,正则表达式将是

/(?<!\\)\$\b\w+\b/g

demonstration(不是JavaScript)

其中

(?<!\\) //do not match a preceding "\"
  \$ //match literal "$"
  \b //word boundary
  \w+ //one or more word characters
  \b //second word boundary, hence making the match a word

当输入反转时,所有标记也是如此,以便匹配。此外,负面的外观被反转为x(?!y)形式的负向前瞻,因此新的正则表达式

/\b\w+\b\$(?!\\)/g;

答案 2 :(得分:-1)

这比乍一看时更难。就像正则表达式一样!

如果你有后视可用,你可以尝试:

/(?<!\\)\$\w+/g

这在JS中不可用。或者,您可以指定您知道存在的边界并使用捕获组,如:

/\s(\$\w+)/g

不幸的是,你不能通过/ b依赖单词边界,因为'\'之前没有这样的边界。

此外,this是一个很酷的网站,用于测试您的正则表达式。 this解释了边界锚点这个词。

答案 3 :(得分:-1)

如果您使用支持负面回溯断言的语言,则可以使用something like this

(?<!\\)\$\w+

我认为这是最干净的方法,但遗憾的是并没有得到所有语言的支持。

这是一个可能有效的黑客实施。

(?:(^\$\w+)|[^\\](\$\w+))

这匹配

  1. 在行的开头跟着多个单词字符的文字$。或...

  2. 文字$前面有任何字符,但反斜杠。

  3. 这是working example