Java正则表达式帮助

Java正则表达式帮助,java,regex,Java,Regex,我有一个包含n个子字符串的字符串,格式如下,我希望匹配: {varName:param1, param2, param2} 要求如下: 只有花括号内的varName是必需的 参数数量没有限制 除var和param名称外,对花括号内的空格没有任何限制,因为它们不能包含空格 我希望能够分别捕获varName和每个参数 我已经想出了一个正则表达式,它几乎就要出现了,但还不完全。如果有任何帮助,我们将不胜感激。我想知道是否更容易明智地使用String.split,而不是与regexp进行上述操作。分隔

我有一个包含n个子字符串的字符串,格式如下,我希望匹配:

{varName:param1, param2, param2}
要求如下:

只有花括号内的varName是必需的 参数数量没有限制 除var和param名称外,对花括号内的空格没有任何限制,因为它们不能包含空格 我希望能够分别捕获varName和每个参数


我已经想出了一个正则表达式,它几乎就要出现了,但还不完全。如果有任何帮助,我们将不胜感激。

我想知道是否更容易明智地使用String.split,而不是与regexp进行上述操作。分隔符冒号/空格/逗号似乎定义得很好。

我想知道简单地明智地使用String.split是否比使用regexp更容易。分隔符冒号/空格/逗号似乎定义得很好。

发布到目前为止的内容。 您可以在本网站上非常轻松地进行测试:

发布到目前为止您拥有的内容。 您可以在本网站上非常轻松地进行测试:
一个正则表达式和一个扫描器怎么样

import java.util.Scanner;

public class Regex {

  public static void main(String[] args) {  
    String string = "{varName: param1, param2, param2}";   
    Scanner scanner = new Scanner(string);
    scanner.useDelimiter("[\\s{:,}]+");
    System.out.println("varName: " + scanner.next());
    while (scanner.hasNext()) {
      System.out.println("param: " + scanner.next());
    }
  }
}

一个正则表达式和一个扫描器怎么样

import java.util.Scanner;

public class Regex {

  public static void main(String[] args) {  
    String string = "{varName: param1, param2, param2}";   
    Scanner scanner = new Scanner(string);
    scanner.useDelimiter("[\\s{:,}]+");
    System.out.println("varName: " + scanner.next());
    while (scanner.hasNext()) {
      System.out.println("param: " + scanner.next());
    }
  }
}

psuedocode中的快速解决方案:

string.match(/{(\w+):([\w\s,]+)}/);
varName = matches[1];
params = matches[2].split(',');

psuedocode中的快速解决方案:

string.match(/{(\w+):([\w\s,]+)}/);
varName = matches[1];
params = matches[2].split(',');

好的,我在正则表达式中找到了一个解决方案,看起来效果不错:

\{\s*[^\{\}\s]+\s*?::\s*[^\{\}\s]+\s*?:,\s*[^\{\}\s]+\s**

甚至假装能够理解它:

名称=[^\{\}\s]+

ws=\s*

\{wsnamews?:?::wsnamews?:,wsnamews*?\}

我不推荐它,但简短的测试似乎表明它是有效的——早上3点的脑筋急转弯


PS:如果您将拆分解决方案与此或类似的解决方案进行比较,我很想知道是否存在任何性能差异-我不认为正则表达式的性能会特别好。

好的,我在正则表达式中找到了一个解决方案,它似乎工作得很好:

String s = "blah blah\n{varName:param1, param2, param2}\nblah";

Pattern p = Pattern.compile(
  "\\{([a-zA-Z]+)(?:\\s*:\\s*([^,\\s]+(?:\\s*,\\s*[^,\\s]+)*))\\}"
);
Matcher m = p.matcher(s);
if (m.find())
{
  String varName = m.group(1);
  String[] params = m.start(2) != -1
                  ? m.group(2).split("[,\\s]+")
                  : new String[0];

  System.out.printf("var: %s%n", varName);
  for (String param : params)
  {
    System.out.printf("param: %s%n", param);
  }
}
\{\s*[^\{\}\s]+\s*?::\s*[^\{\}\s]+\s*?:,\s*[^\{\}\s]+\s**

甚至假装能够理解它:

名称=[^\{\}\s]+

ws=\s*

\{wsnamews?:?::wsnamews?:,wsnamews*?\}

我不推荐它,但简短的测试似乎表明它是有效的——早上3点的脑筋急转弯

PS:如果您将拆分解决方案与此或类似的解决方案进行比较,我很想知道是否存在任何性能差异-我不认为正则表达式的性能会特别好

String s = "blah blah\n{varName:param1, param2, param2}\nblah";

Pattern p = Pattern.compile(
  "\\{([a-zA-Z]+)(?:\\s*:\\s*([^,\\s]+(?:\\s*,\\s*[^,\\s]+)*))\\}"
);
Matcher m = p.matcher(s);
if (m.find())
{
  String varName = m.group(1);
  String[] params = m.start(2) != -1
                  ? m.group(2).split("[,\\s]+")
                  : new String[0];

  System.out.printf("var: %s%n", varName);
  for (String param : params)
  {
    System.out.printf("param: %s%n", param);
  }
}
如果您想找到一种方法来匹配字符串,并用一个正则表达式来分解所有组件,那么就不用麻烦了;除非您切换到Perl6,否则这是最好的。至于性能,我不会担心,直到它成为一个问题



如果您想找到一种方法来匹配字符串,并用一个正则表达式来分解所有组件,那么就不用麻烦了;除非您切换到Perl6,否则这是最好的。至于性能,在它成为一个问题之前,我不会担心它。

你说你有一个正则表达式,它就快到了。也许您可以发布到目前为止所管理的内容?问题是它只匹配varName组1第一个参数组2和最后一个参数组3\{[a-zA-Z]+?:\s*:\s*[^\s]+?:\s*,\s*[^,\s]+*\s*\}因为每个正则表达式都有固定数量的组,所以不能使用它捕获无限数量的子字符串。你需要某种循环或拆分。好吧,就是这样:-thx很多。你说你有一个正则表达式,它就在那里。也许您可以发布到目前为止所管理的内容?问题是它只匹配varName组1第一个参数组2和最后一个参数组3\{[a-zA-Z]+?:\s*:\s*[^\s]+?:\s*,\s*[^,\s]+*\s*\}因为每个正则表达式都有固定数量的组,所以不能使用它捕获无限数量的子字符串。你需要某种循环或拆分。那就是:-thx很多。也许,虽然我确实需要使用正则表达式来查找周围字符串中的整个模式,所以我认为我最好同时匹配内部部分。同意,正则表达式真的不是这个问题的解决方案。不可读的OneLiner,还有其他正则表达式吗?可能,虽然我确实需要使用正则表达式来查找周围字符串中的整个模式,因此我认为我最好同时匹配内部部分。同意,正则表达式确实不是解决此问题的方法。不可读的OneLiner,还有其他正则表达式吗?很难维护,语法也很简单,只需几行就可以轻松解析。添加了我迄今为止所获得的内容添加了我迄今为止所获得的内容是的,考虑到这一点,这篇文章是放弃并这么做之前的最后一次欢呼。有点担心单独拆分的性能,因为它会有相当高的容量-尽管,tbh,我不知道。是的,想到了这一点,这篇文章是在放弃并这么做之前的最后一次欢呼。担忧
我对单独拆分的性能有点了解,因为它的容量相当大——不过,我不知道。有趣的是,以前从未遇到过Scanner类。现在开始阅读。有趣的是,以前从未遇到过Scanner类。现在开始阅读。是的,谢谢大家的帮助。我现在知道我找错人了。是的,谢谢大家的帮助。我现在知道我找错了方向。