正则表达式:匹配以特定字符开头和结尾的字符串

3
我需要一个正则表达式来在Eclipse中进行搜索,以匹配所有以${开头并以}结尾的字符串,但这些字符串之间不应该有pageContext。
例如: ${requestScope.user} ${sessionScope.user}
应该匹配,但${pageContext.request}不应该匹配。
在我所做的所有努力之后,我得到了这个正则表达式(\${),它可以匹配以${开头的字符串,但是不符合我的要求。任何帮助将不胜感激。
2个回答

2
您可以使用负向先行断言来排除特定匹配项:
\$\{(?!pageContext\.).*?\}
    ^^^^^^^^^^^^^^^^
(?:(?!pageContext\.)\$\{[^{}]*\})+

(?!pageContext\.)预查会使所有以{后面跟着pageContext.的匹配都失败。此外,您可以使用[^{}]*代替.*?

请参见正则表达式演示

模式详情

  • \$ - 字面意义上的符号$
  • \{ - 字面意义上的符号{
  • (?!pageContext\.) - 如果{后面紧跟着pageContext.,则匹配失败
  • .*? - 除换行符外的任何0个或多个字符(或者[^{}]* - 除了{}之外的零个或多个字符)
  • \} - 字面意义上的符号}

注意

如果您需要避免匹配内部有pageContext.的任何${...}子字符串,请使用

(?:(?!pageContext\.)\$\{[^{}]*\})+
\$\{(?![^{}]*pageContext\.)[^{}]*\}
    ^^^^^^^^^  

在这里,先行断言中的[^{}]*将查找pageContext.之后除了{}之外的0个或多个字符。


非常感谢,它起作用了,但它选择了整个字符串,如果我只想选择 ${ 和 } 与上述条件不同呢? - Mohan Seth
@Mckenzie 这个正则表达式实际上没有匹配到任何内容,这意味着无论你将其运行到哪里,都会返回与你的正则表达式匹配的字符串。根据你的正则表达式使用方式,添加一个捕获可能有用也可能没用,但是你可以通过这样来捕获匹配:(\$\{(?!pageContext\.).*?\}) - Jonathan Mee
1
@Mckenzie:虽然可以使用\$\{(?!pageContext\.)匹配${后面不跟随pageContext的内容,但是无法使用Eclipse正则表达式引擎匹配未在{pageContext.之前出现的},因为它不支持无限宽度的回溯。 - Wiktor Stribiżew
FYI:最快的解决方案是\$\{(?!pageContext\.)[^{}]*\}。或者如果{...}中可能有{,则使用\$\{(?!pageContext\.)[^}]*\} - Wiktor Stribiżew

0

向前或向后查找是比较耗费资源的。你应该优先考虑使用可选匹配技巧:

\$\{(?:.*pageContext.*|(.*))\}

实时示例

为了避免混淆,让我明确一下,这将匹配任何以"${"前缀和"}"后缀开头的字符串,但如果该字符串包含"pageContext",则第一个捕获将为空。如果第一个捕获不为空,则您有一个符合条件的字符串。


它也选择了 ${pageContext.request},但不应该这样做。 - Mohan Seth
@Mckenzie 从实时示例中可以看出,它没有捕获"${pageContext.request}",只有在匹配时才会捕获。您如何使用此正则表达式的结果? - Jonathan Mee
@Jonathan 它已经捕获了,我正在http://regexr.com/上进行测试,请检查,Wiktor提供的解决方案有效。 - Mohan Seth
1
@Mckenzie 如果您查看“列表”选项卡,它会向您显示捕获和相应输入。需要注意的是,我的代码将匹配每一行以"${"前缀和"}"后缀开头的内容,但如果在大括号之间找到了“pageContext”,则捕获将为空:http://regexr.com/3du31 - Jonathan Mee
看问题:应该匹配...不应该。为什么要谈论捕获?你的正则表达式匹配所有的{...} - Wiktor Stribiżew
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接