regex 如何在正则表达式中排除括号之间的特定字符?

pxq42qpu  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(414)

我只想找到并删除第二行和第三行中的感叹号,但保留第一行中的感叹号。

[some text !]
[some text !
some text !

我试过了

(?<!\[.*)(!)(?!.*\])

但是,look behind不能消耗任何字符。

rqcrx0a6

rqcrx0a61#

在Notepad++中,替换:

(                # Capturing group consisting of
  ^\[            # a square bracket at the beginning of line,
  [^[\]]*        # 0+ non-bracket characters, then
  \]$            # a closing bracket at the end of line,
)                # 
|                # or
!                # a literal '!'

其中:

\1

这匹配所有带方括号的字符串和感叹号,但由于我们捕获的是前者并将其添加回去,因此只会删除感叹号。
试试看on regex101.com
如果不能保证括号位于行的开头/结尾,只需删除^$(\[[^[\]]*\])|!。请注意,这可能匹配方括号中的多行字符串:

[some tex!t !]
[som!e text !
!some text !
] ! foobar

...变成:

[some tex!t !]
[som!e text !
!some text !
]  foobar

试试on regex101.com
要将匹配限制在一行上,请向字符类添加\n(\[[^[\]\n]*\])|!
试试on regex101.com
或者,使用(*SKIP)(*FAIL)放弃第一部分,如bobble bubble所示:\[[^[\]\n]\](*SKIP)(*FAIL)|!
试试on regex101.com

相关问题