Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将带有值的字符串与带有占位符的字符串进行比较,从中找出值_Java - Fatal编程技术网

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你能解释一下吗。非常好用。非常感谢你的解释。谢谢。你能解释一下吗。很好用。非常感谢你的解释。