繁体   English   中英

如何匹配所有以美元符号开头但不减美元的单词

[英]How to match all words starting with dollar sign but not slash dollar

我想匹配所有以美元符号开头但不以斜杠和美元符号开头的单词。 我已经尝试过一些正则表达式。

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

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

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

预期结果

*$10*

*$i01d*

但不是这个

*$id*

找到所有预期的匹配词后,我要替换此对象。

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

 s = String.raw`$10<i class="">$i01d</i>\\$id` found = s.replace(/\\\\./g, '').match(/\\$\\w+/g) console.log(found) 

这里的最大问题是,您需要一个否定的回首 ,但是,JavaScript不支持它。 可以粗略地模拟它,但是我将提供一个替代方法,虽然效果不佳,但可以使用:

 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); 

它不是很优雅,但是可以胜任。 下面是它的工作原理:

JavaScript 确实支持前瞻表达式( (?>) )和否定前瞻( (?!) )。 由于这是反向查找的反向操作 ,因此您可以反转字符串并反转正则表达式,这将完全匹配您想要的内容。 由于所有匹配项都将相反,因此您还需要将它们恢复为原始状态。

就像我说的那样,它并不优雅,因为它会执行很多字符串操作,但确实会产生您想要的结果。

在Regex101上实际操作

正则表达式的解释通常,“只要不以y 开头的匹配x ”将表示为(?<!y)x ,因此在您的情况下,正则表达式将为

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

演示 (不是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;

这比刚开始脸红时要难得多。 正则表达式怎么样!

如果有后备存储,可以尝试:

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

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

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

不幸的是,您不能依靠/ b来限制单词边界,因为'\\'之前没有这样的边界。

此外, 是测试您的正则表达式表达式的一个不错的站点。 这就解释了边界锚这个词。

如果您使用的语言支持否定的回溯断言,则可以使用如下所示的语言

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

我认为这是最干净的方法,但不幸的是,并非所有语言都支持。

这是一种可能更有效的黑客实现方式。

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

这匹配

  1. 行首的文字$ ,后接多个单词字符。 要么...

  2. 文字$前面带有反斜杠以外的任何字符。

这是一个工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM