Javascript Regex:如何模拟“;匹配而不捕获”;积极观察的行为
Javascript Regex: how to simulate "match without capture" behavior of positive lookbehind?
我有一个相对简单的正则表达式问题——如果字符串中的特定单词是完整单词或前缀,我需要匹配它们。有了单词边界,它看起来像这样:
'b(word1|word2|prefix1|prefix2)
然而,我不能使用单词边界条件,因为有些单词可能以奇数字符开头,例如.999
我的解决方案是为这些奇怪的情况寻找空白或起始标记。
('b|^|'s)(word1|word2|prefix1|prefix2)
现在像.999这样的单词仍然可以正确匹配,但它也会捕获匹配单词/前缀之前的空白。出于我的目的,我不能让它捕捉空白。
正面的lookbehinds似乎可以解决这个问题,但javascript不支持它们。有没有其他方法可以让我采取同样的行为来解决这个问题?
您可以使用(?:)
:使用非捕获组
/(?:'b|^|'s)(word1|word2|prefix1|prefix2)/
更新:
根据你想用什么来代替它(以及@AlanMoore关于'b
的好观点),你可能想用这个:
var regex = /(^|'s)(word1|word2|prefix1|prefix2)/g;
myString.replace(regex,"$1<span>$2</span>");
请注意,我将第一组改回了捕获组,因为它将是匹配的一部分,但您希望将其保留在替换字符串中(对吗?)。还添加了g
修饰符,这样字符串中的所有出现都会发生这种情况(假设这是您想要的)。
让我们先弄清楚术语。正则表达式通常会消耗与其匹配的所有内容。当您执行replace()
时,所有消耗的内容都将被覆盖。您还可以单独捕获匹配文本的部分,并使用$1
、$2
等将其插回
当你使用单词boundary时,你不必担心这一点,因为'b
不会消耗任何东西。但现在,如果有前导空格字符的话,你就要使用它,所以你必须把它插回原处。我不知道你要用什么来替换匹配项,所以在这个演示中,我将不使用任何内容来替换它们。
result = subject.replace(/(^|'s)(word1|word2|prefix1|prefix2)/g, "$1");
请注意,不再需要'b
。事实上,必须删除它,否则它将匹配xyz.999
中的.999
,因为'b
在z
和.
之间匹配。我敢肯定你不想那样。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- knockoutjs可观察数组
- 使用jasmine模拟对服务器的调用
- 模拟谷歌地图中的点击
- 多次发射多个可观察器的问题
- 使用模拟按键在输入框中自动输入文本
- 模拟chrome.storage.local函数使用Jasmine
- 未激发路由的控制器属性上的观察者
- 从数据库中检索字段,而不模拟它们
- react testUtils模拟点击单选按钮而不触发onchange
- 无法在关闭弹出窗口时传递可观察的数据
- 如何在ember单元测试中模拟_super()方法
- Javascript中对象的每个()的模拟值
- firefox插件:退出不工作的应用程序观察器
- 模拟<按钮>在<asp:button>
- 如何收集Knockout可观察性以放入JSON
- javascript上的数字类型模拟
- 在rxjs中巧妙的蒸汽可观察合并
- Knockout的可写计算在AngularJS中可观察的模拟是什么?
- Javascript Regex:如何模拟“;匹配而不捕获”;积极观察的行为