java - 正则表达式在字符串中查找由 % 包围的变量
问题描述
需要在字符串中找到“变量”。表示变量的是 %[/w]+%,关键是字符串中可以有多个变量:
%ABC%
%ABC%-%RED%
Lorem ipsum %GeT% sit amet, %% consectetur %QW23% elit.
在第三个示例中,不应找到 %%,它将替换为单个 %。#[\w+-]+# 之类的东西不起作用,因为它无法确定在第二行中它是 %ABC% 和 %RED%,而是 %-%。我的印象是需要同时使用组和反向引用,但我找不到任何好的例子来解释如何在 Java 中做到这一点。
人们正在寻求一些问题的答案,所以你去:
我期望的最终输出到底是什么?好吧,正如主题所暗示的 %ABC% 是在其他地方定义的“变量”,最终目标是“找到变量并用正确的值替换它”。正则表达式的目标是查找字符串中的所有“变量”。
因此,内存中某处有一张地图,其中:
ABC = "mike"
RED = "Red Storm"
GeT = "hometown"
QW23 = "Quick and easy"
(旁注:如果键需要在名称周围有 % ,那也可以)
正则表达式的目标是“找到”变量,因此在第一个字符串中它将找到 ABC(或 %ABC%),以便代码和查找 ABC 以确定正确的值是 mike,等等。 . 这是给定字符串的期望输出:
mike
mike-Red Storm
Lorem ipsum hometown sit amet, % consectetur Quick and easy elit.
我并不期望 reg 表达式实际上进行完全替换,而只是找到片段以便其他代码进行替换。我也不指望它将 %% 转换为 %,但不要管它,以便事后简单搜索 %% 可以将其转换为 %。
解决方案
我相信您正在寻找正则表达式模式
(?<!%%)(?<=%)\w+(?=%)(?!%%)
%
这将找到在每一侧被单个字符包围的变量。
在这里测试正则表达式。
Java代码:
final Pattern pattern = Pattern.compile("(?<!%%)(?<=%)\\w+(?=%)(?!%%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
在此处测试 Java 代码。
更新:
如果您想按照下面评论中的要求捕获组,请使用以下模式:
(?<!%)(%)(\w+)(%)(?!%)
在这里测试这个模式。
...和Java代码:
final Pattern pattern = Pattern.compile("(?<!%)(%)(\\w+)(%)(?!%)");
final Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1) + " | " +
matcher.group(2) + " | " +
matcher.group(3));
}
在此处测试此代码。
推荐阅读
- paypal-sandbox - PayPal企业账户不接受付款
- javascript - 将 WebGL 框架 (PlayCanvas) 导入 React
- grails - 无法在excel中写入行
- javascript - 更改页面时悬停的背景图像卡住
- angular - 在 Angular 2 中录制音频语音并转换为 .wav 文件
- ios - 位置访问从“从不”更改为“始终”时多次调用 didFailWithError()
- ios - 如何以更好的性能在 UITableViewCell 的 UIlabel 内显示自定义线方向
- python - 拦截DNS请求——推导QR、Opccode、AA、TC等
- flask - 你可以使用 $SCRIPT_ROOT 在 Flask 中重定向吗?
- java - 防止父级仅针对某些视图获取触摸事件?