首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在字符串B之前的任何地方找到字符串B,则尝试匹配字符串A

如果在字符串B之前的任何地方找到字符串B,则尝试匹配字符串A
EN

Stack Overflow用户
提问于 2020-02-01 21:08:13
回答 2查看 161关注 0票数 0

我想要做的是,如果一个字符串由一个以"!“开头的子字符串组成。封装在"“和"”中,以便通过空格将这些括号与字符串的其余部分分开,例如" !foo“->”!foo“、" !bar”->“!bar”等等。因为该子字符串可以是可变长度的,所以我认为这必须用regex来完成。我的想法是分两个步骤-首先分离第一个括号,然后分开第二个括号。

第一个并不难;正则表达式只是\[!,所以我可以在Javascript中做str = str.replace(/\[!/g, "[ !");。这是我无法工作的第二部分。

因为现在,我需要匹配"]“如果字符串文字"[!!”在它之前的任何地方都能找到。因此,简单的正向后视不匹配,因为它只直接看后面:(?<=\Q[ !\E)\]不匹配。

我仍然不明白为什么,但我不允许在非固定长度的情况下进行正向查找;(?<=\Q[ !\E.*)\]将错误Syntax Error: Invalid regular expression: missing /抛到控制台中,而这个regex调试器生成一个模式错误,解释“查找后面的量词使其非固定宽度”。

在查找和捕获组之间放置一个非固定宽度的非捕获组不工作;(?<=\Q[ !\E)(?:.*)\]不匹配。

有一件事是行不通的,那就是试着去匹配“!”在字符串的开头,因为这个"!foo“字符串本身实际上是一个更大的字符串的子字符串,而不是开头。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-01 21:15:58

使用两个正面的外观,您可以断言左边的是一个开放的方括号(?<=\[)

然后匹配除]以外的任何字符,使用一个带有感叹号的否定字符类 ![^[\]]+,并断言右边的是使用(?=])的结束方括号。

注意,在Javascript中,查找还没有得到广泛的支持。

代码语言:javascript
复制
(?<=\[)![^[\]]+(?=])

替换中使用匹配的子字符串$&

Regex演示

代码语言:javascript
复制
[
  "[!foo]",
  "[!bar]"
].forEach(s =>
  console.log(s.replace(/(?<=\[)![^[\]]+(?=])/g, " $& "))
)

或者您也可以使用3个捕获组来代替:

代码语言:javascript
复制
(\[)(![^\]]+)(\])

在替换用途

代码语言:javascript
复制
$1 $2 $3

Regex演示

代码语言:javascript
复制
[
  "[!foo]",
  "[!bar]"
].forEach(s =>
  console.log(s.replace(/(\[)(![^\]]+)(\])/g, "$1 $2 $3"))
)

票数 1
EN

Stack Overflow用户

发布于 2020-02-01 21:16:25

您可以使用这个regex:\[!([^]]+)\]和这个替换字符串[! \1 ]

解释

裁判官:

  • \[!:比赛开始于[!
  • ([^]]+):在第1组中捕获所有不是的字符]
  • \]:匹配]

替换:用[!{]组的内容替换完全匹配。

Regex Demo

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60021105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档