在给定正则表达式的字符串中查找标记

时间:2017-10-13 06:17:21

标签: java regex

我有一个像

这样的字符串
`hello@{name},how are you today, location: @{location}, time: @{time}`

我想找到所有令牌以“@ {”开头并以“}”结尾。即我的输出将是以下令牌的列表:@ {name},@ {location},@ {time}。或者只是姓名,地点,时间。

5 个答案:

答案 0 :(得分:1)

您可以尝试使用带有@\{(.*?)\}模式的正则表达式匹配器:

String input = "hello@{name},how are you today, location: @{location}, time: @{time}";
String pattern = "@\\{(.*?)\\}";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
while (m.find()) {
    System.out.println("match: " + m.group(1) );
}

<强>输出:

match: name
match: location
match: time

在这里演示:

Rextester

答案 1 :(得分:1)

如果您只想查找结果,使用正则表达式可能是最快速,最简单的方法。 java代码可能是这样的:

String str="hello@{name},how are you today, location: @{location}, time: @{time}";
Pattern pattern = Pattern.compile( "@\\{(.*?)\\}");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1) );
}

或者您想以自己的方式解决问题,您也可以编写一些简单的for循环代码来解决问题。通过编写自己的代码来开始学习程序是一件好事,这里是一个例如:

   String str="hello@{name},how are you today, location: @{location}, time: @{time}";
   String tempStr="";
   boolean inBracket=false;
   for (int i=0;i<str.length();i++){
          if(!inBracket) {
              if (i<str.length()-2&&str.charAt(i) == '@'&&str.charAt(i+1) == '{') {
                  inBracket=true;
                  i++;
              }
          }else{
              if(str.charAt(i)=='}'){
                  System.out.println(tempStr);
                  tempStr="";
                  inBracket=false;
              }else{
                  tempStr+=str.charAt(i);
              }
          }
      }

<强>输出:

name
location
time

答案 2 :(得分:0)

您可以使用@\{([^\}]*)\}表达式来查找令牌

组(0)将返回带有@{...}的标记,组(1)将仅返回大括号中的值

答案 3 :(得分:0)

这很简单:

@\{(.+?)\}
  • @匹配@字符
  • \{{
  • 相匹配
  • \}}
  • 相匹配
  • .匹配所有内容
  • +表示至少匹配.一次,最多无限次
  • ?+懒惰,尝试尽可能少,因此匹配不会超过}

试试here

你只需要得到每场比赛的第1组!

Matcher matcher = Pattern.compile("@\\{(.+?)\\}").matcher("hello@{name},how are you today, location: @{location}, time: @{time}");
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

更快但不太直观(IMO)的方法是将.+?部分替换为[^}]+,这意味着&#34;匹配所有不是}的内容尽可能多次&#34;。

答案 4 :(得分:0)

你必须:

  • 创建一个Pattern来定义匹配的模式
  • 从中获取字符串上的Matcher
  • 迭代匹配

像这样的东西(动态编写的代码,未经检查):

import java.util.regex.*;

// assume that @{...} may contain only letters
// { and } symbols must be \escaped
Pattern p = Pattern.compile("@\\{([a-zA-Z]+)\\}");
Matcher m = p.matcher("hello@{name},...");
List<String> matches = new ArrayList<String>();
while (m.find()) {
    String x = m.group(1);   // returns "name" from "@{name}"
    // use group(0) to get the whole "@{name}"
    matches.add(x);
}