Java 将带有值的字符串与带有占位符的字符串进行比较,从中找出值
我有如下模板Java 将带有值的字符串与带有占位符的字符串进行比较,从中找出值,java,Java,我有如下模板 Hello {user}, your request id is {id}, -------1 我在文本中填充了值,就像 Hello ABC , your request id is 1234. --------2 现在我的程序的输入是2,我想检索如下值 {user} = ABC {id} = 1234 你能为我提出解决上述问题的办法吗。提前谢谢 我想检索在模板中有占位符的值。输入是带值的字符串,我必须将模板与该字符串匹配,才能从该字符串中的模板中检索占位符的
Hello {user}, your request id is {id}, -------1
我在文本中填充了值,就像
Hello ABC , your request id is 1234. --------2
现在我的程序的输入是2,我想检索如下值
{user} = ABC
{id} = 1234
你能为我提出解决上述问题的办法吗。提前谢谢
我想检索在模板中有占位符的值。输入是带值的字符串,我必须将模板与该字符串匹配,才能从该字符串中的模板中检索占位符的值。使用此选项将字符串捕捉到组1和组2,然后检索:
Hello ([^,]+), your request id is ([^.]+)
看
您的间距不一致,所以我整理了它们,还使用句点作为id
字段的分隔符,但它都可以调整
示例代码
String userName = null;
String userID = null;
Pattern regex = Pattern.compile("Hello ([^,]+), your request id is ([^.]+)");
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
userName = regexMatcher.group(1);
userID = regexMatcher.group(2);
}
解释
匹配Hello
和一个空格Hello
中的括号将任何非逗号的字符捕获到组1中([^,]+)
匹配文字字符,您的请求id是
捕获第1组中不属于句点的任何字符李>([^.]+)
这假设在您的ID之后会有一个句点,如在
Hello ABC中,您的请求ID是1234。
如果没有,我们将更改分隔符。使用此选项将字符串捕获到组1和组2,然后检索:
Hello ([^,]+), your request id is ([^.]+)
看
您的间距不一致,所以我整理了它们,还使用句点作为id
字段的分隔符,但它都可以调整
示例代码
String userName = null;
String userID = null;
Pattern regex = Pattern.compile("Hello ([^,]+), your request id is ([^.]+)");
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
userName = regexMatcher.group(1);
userID = regexMatcher.group(2);
}
解释
匹配Hello
和一个空格Hello
中的括号将任何非逗号的字符捕获到组1中([^,]+)
匹配文字字符,您的请求id是
捕获第1组中不属于句点的任何字符李>([^.]+)
这假设在您的ID之后有一个句点,如在
Hello ABC中,您的请求ID是1234。
如果没有,我们将更改分隔符。如果您想使用模板进行解析,您可以执行以下操作:
public static void main(String[] args) {
String template = "Hello {user}, your request id is {id}.";
String withValues = "Hello ABC , your request id is 1234.";
String patternFromTemplate = template.replaceAll("\\.", "\\\\."); // escape "."
patternFromTemplate = patternFromTemplate.replace("{user}", "(.*)"); // capturing group 1
patternFromTemplate = patternFromTemplate.replace("{id}", "(.*)"); // capturing group 2
Pattern p = Pattern.compile(patternFromTemplate);
Matcher m = p.matcher(withValues);
if (m.matches()) {
System.out.println("{user} = "+m.group(1));
System.out.println("{id} = "+m.group(2));
}
}
但是,当字符串用作正则表达式时,请小心模板中具有特殊含义的字符(如
)。请注意,如果您的模式发生显著变化(例如,如果id
首先出现,或者id
或user
根本不出现在模板中),则这将中断
它的作用是:
- 转义模板中的所有
字符,这样它们就不会弄乱正则表达式 - 将模板中的
替换为{user}
(捕获组1)(.*)
- 将模板中的
替换为{id}
(捕获组2)(.*)
- 使用值将正则表达式应用于字符串
- 提取匹配项(如果正则表达式匹配)
与@zx81建议的基本相同,唯一的区别是这里的正则表达式是基于模板动态创建的。如果您想使用模板进行解析,可以执行以下操作:
public static void main(String[] args) {
String template = "Hello {user}, your request id is {id}.";
String withValues = "Hello ABC , your request id is 1234.";
String patternFromTemplate = template.replaceAll("\\.", "\\\\."); // escape "."
patternFromTemplate = patternFromTemplate.replace("{user}", "(.*)"); // capturing group 1
patternFromTemplate = patternFromTemplate.replace("{id}", "(.*)"); // capturing group 2
Pattern p = Pattern.compile(patternFromTemplate);
Matcher m = p.matcher(withValues);
if (m.matches()) {
System.out.println("{user} = "+m.group(1));
System.out.println("{id} = "+m.group(2));
}
}
但是,当字符串用作正则表达式时,请小心模板中具有特殊含义的字符(如
)。请注意,如果您的模式发生显著变化(例如,如果id
首先出现,或者id
或user
根本不出现在模板中),则这将中断
它的作用是:
- 转义模板中的所有
字符,这样它们就不会弄乱正则表达式 - 将模板中的
替换为{user}
(捕获组1)(.*)
- 将模板中的
替换为{id}
(捕获组2)(.*)
- 使用值将正则表达式应用于字符串
- 提取匹配项(如果正则表达式匹配)
与@zx81建议的基本相同,唯一的区别是这里的regex是基于模板动态创建的。感谢您提供的解决方案,但我希望占位符不是regex。因为这些占位符将由不了解regex的用户放置。我不确定我是否理解。:)你给你的问题加上了标签,说“我在正则表达式方面很弱”。你能再解释一下吗?我用正则表达式试过了,它对我很管用。但我在搜索模板正则表达式,在这里,我会将模板与实际字符串匹配,这会给我上面提到的结果。好吧,我误解了。请看一下@mth:)的解决方案,谢谢您的解决方案,但我希望那里的占位符不是regex。因为这些占位符将由不了解regex的用户放置。我不确定我是否理解。:)你给你的问题加上了标签,说“我在正则表达式方面很弱”。你能再解释一下吗?我用正则表达式试过了,它对我很管用。但我在搜索模板正则表达式,在这里,我会将模板与实际字符串匹配,这会给我上面提到的结果。好吧,我误解了。请看一下@mth:)的解决方案谢谢mth你能解释一下吗。非常好用。非常感谢你的解释。谢谢。你能解释一下吗。很好用。非常感谢你的解释。