括号中的字母或数字的正则表达式

时间:2014-01-28 20:13:05

标签: java regex

我正在使用Java来使用正则表达式处理文本。我使用以下正则表达式

^[\([0-9a-zA-Z]+\)\s]+

将括号中的一个或多个字母或数字匹配一次或多次。例如,我喜欢匹配 (aaa)(bb)(11)(AA)(iv) 要么 (111)(aaaa)(i)(V)

我在http://java-regex-tester.appspot.com/上测试了这个正则表达式,它正在运行。但是当我在我的代码中使用它时,代码无法编译。这是我的代码:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Tester {

        public static void main(String[] args) {

            Pattern pattern = Pattern.compile("^[\([0-9a-zA-Z]+\)\s]+");

            String[] words = pattern.split("(a) (1) (c) (xii) (A) (12) (ii)");

            String w = pattern.

            for(String s:words){

                System.out.println(s);

            }
    }
}

我尝试使用\而不是\但正则表达式给出了与我预期不同的结果(它只匹配一组像(aaa)而不是多组如(aaa)(111)(ii)。

两个问题:

  1. 如何修复此正则表达式并能够匹配多个组?
  2. 我如何单独获得单独的匹配(如(aaa)单独然后(111)等)。我尝试过pattern.split,但对我没用。

3 个答案:

答案 0 :(得分:7)

首先,您希望使用另一个反斜杠转义引号中的任何反斜杠。正则表达式将它视为一个反斜杠。 (例如,在引号中标注单词字符\ w)

其次,你必须完成以下行:

String w = pattern.

该行解释了为什么它不能编译。

答案 1 :(得分:2)

这是我的最终解决方案,以匹配出现在行首的括号中的各个字母/数字组,并忽略其余部分

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Tester {
    static ArrayList<String> listOfEnums;
    public static void main(String[] args) {
        listOfEnums = new ArrayList<String>();
        Pattern pattern = Pattern.compile("^\\([0-9a-zA-Z^]+\\)");
        String p = "(a) (1) (c) (xii) (A) (12) (ii) and the good news (1)";
        Matcher matcher = pattern.matcher(p);
        boolean isMatch = matcher.find();
        int index = 0;
        //once you find a match, remove it and store it in the arrayList. 
        while (isMatch) {
          String s = matcher.group();
          System.out.println(s);
          //Store it in an array
          listOfEnums.add(s);
          //Remove it from the beginning of the string.
          p = p.substring(listOfEnums.get(index).length(), p.length()).trim();
          matcher = pattern.matcher(p);
          isMatch = matcher.find();
          index++;
        }
    }
}

答案 2 :(得分:0)

1)你的正则表达式是不正确的。您希望在括号中匹配单个字母/数字组,并且当前正则表达式将仅匹配一个或多个此类组的单个字符串。即它会匹配

(abc) (def) (123)

作为一个单独的群体,而不是三个独立的群体。

一个更好的正则表达式只匹配结束括号

\([0-9a-zA-Z^\)]+\)

2)Java要求你用另一个反斜杠转义所有反斜杠

3)split()方法不会做你想要的。它会在你的字符串中找到所有匹配项然后将它们抛弃并返回剩下的数组。您想使用matcher()代替

Pattern pattern = Pattern.compile("\\([0-9a-zA-Z^\\)]+\\)");
Matcher matcher = pattern.matcher("(a) (1) (c) (xii) (A) (12) (ii)");

while (matcher.find()) {
  System.out.println(matcher.group());
}