Java正则表达式,点匹配

时间:2014-08-20 14:00:56

标签: java regex split

我有一个字符串形式:

{something here}{something here}{something here}

等 总之,有一些括号内的文字或任何内容(任何字符)。 我想将它拆分成一个数组(使用Java' s String.split(regex)函数)。我使用的正则表达式是\\{.*\\},但它无效。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

public static void main(String[] args) {
    String input="{something here}{something here}{something here}";
    String[] parts=input.substring(1,input.length()-1).split("\\}\\{");
    for(String s:parts)
        System.out.println(s);
}

输出:

something here
something here
something here

答案 1 :(得分:0)

在正则表达式中,*是贪婪的,这意味着它将消耗尽可能多的字符。这意味着正则表达式:\{.*\}将匹配整个字符串,因为。*将匹配“这里的东西} {这里的东西} {这里的东西”。 放一个?在*之后会使它以非贪婪的方式运行,这意味着它只会消耗字符直到下一个表达式匹配。 因此,请尝试使用\{.*?\}作为正则表达式

答案 2 :(得分:0)

split()方法中的参数指定了部件之间的 分隔符 ,而不是部件本身。

根据Sotirios Delimanolis的建议,您可以通过重复匹配模式来实现目标。下面的示例代码获取大括号内的文本。

    String val = "{alpha}{beta}{delta\nepsilon}";
    Pattern pattern = Pattern.compile( "\\{(.*?)\\}", Pattern.DOTALL);
    Matcher matcher = pattern.matcher( val );
    while ( matcher.find() ) {
        String part = matcher.group(1);
        System.out.print( String.format("%s,", part));
    }

.*?表达式提供了一个不情愿的匹配,它更喜欢匹配字符串中尽可能少的字符。如果您只使用.*,这是一个贪婪的匹配 - 第一个匹配将是整个字符串。

您在删除的答案评论中提到,您的“此处”字符串可以包含新行。为了 '。'要匹配换行符,您需要使用Pattern.DOTALL标志,如上所示。

matcher.group(1)的电话会为您提供与capturing group (.*?)匹配的文字。如果你想要包括括号,你可以省略parantheses并简单地调用matcher.group(0)来获得整个匹配。

答案 3 :(得分:-1)

你知道关于regexps的引用...... 好吧,它没有帮助。

然而,(通常情况下)测试的帮助是什么?正则表达式可以使用RegExp Planet

等网站在线测试

因此,当用作测试字符串{a}{long}{text with spaces}时,我可以找到以下\{([^\}]*)\}作为“好”的正则表达式。并且,引用源网站

  

正则表达式{([^}] )}
  作为Java字符串“\ {([^ \}]
)\}”

因为不应该忘记添加双反斜杠