我希望匹配所有以美元符号开头而不是斜线和美元符号的单词。 我已经尝试了一些正则表达式。
allow write: if request.resource.size > 0
字符串
(?:(?!\\)\$\w+)
\\(\\?\$\w+)\b
预期结果
$10<i class="">$i01d</i>\$id
但不是这个
*$10*
*$i01d*
找到所有预期的匹配单词后,我想替换这个我的对象。
答案 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不支持它。可以粗略地模仿它,但我会提供一个替代方案,虽然不是很好,但仍然有效:
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;
它不优雅,但它会完成这项工作。以下是它的工作原理:
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依赖单词边界,因为'\'之前没有这样的边界。
答案 3 :(得分:-1)
如果您使用支持负面回溯断言的语言,则可以使用something like this。
(?<!\\)\$\w+
我认为这是最干净的方法,但遗憾的是并没有得到所有语言的支持。
这是一个可能有效的黑客实施。
(?:(^\$\w+)|[^\\](\$\w+))
这匹配
在行的开头跟着多个单词字符的文字$
。或...
文字$
前面有任何字符,但反斜杠。