使用Regex忽略java中的模式

时间:2012-12-03 05:49:49

标签: java regex

我有一句话:"we:PR show:V"。 我想使用正则表达式模式匹配器匹配":"之后和"\\s"之前的那些字符。 我使用了以下模式:

Pattern pattern=Pattern.compile("^(?!.*[\\w\\d\\:]).*$");

但它没有用。 获得输出的最佳模式是什么?

2 个答案:

答案 0 :(得分:2)

对于这种情况,如果你使用的是java,那么使用子字符串做一些事情会更容易:

String input = "we:PR show:V";
String colon = ":";
String space = " ";
List<String> results = new ArrayList<String>();
int spaceLocation = -1;
int colonLocation = input.indexOf(colon);
while (colonLocation != -1) {
    spaceLocation = input.indexOf(space);
    spaceLocation = (spaceLocation == -1 ? input.size() : spaceLocation);
    results.add(input.substring(colonLocation+1,spaceLocation);

    if(spaceLocation != input.size()) {
        input = input.substring(spaceLocation+1, input.size());
    } else {
        input = new String(); //reached the end of the string
    }
}
return results;

这比尝试在正则表达式上匹配要快。

答案 1 :(得分:1)

以下正则表达式假定冒号后面的任何非空格字符(反过来以非冒号字符开头)是有效匹配:

[^:]+:(\S+)(?:\s+|$)

使用类似:

String input = "we:PR show:V";
Pattern pattern = Pattern.compile("[^:]+:(\\S+)(?:\\s+|$)");
Matcher matcher = pattern.matcher(input);
int start = 0;
while (matcher.find(start)) {
    String match = matcher.group(1); // = "PR" then "V"
    // Do stuff with match
    start = matcher.end( );
}

模式按顺序匹配:

  1. 至少有一个不是冒号的字符。
  2. 冒号。
  3. 至少非空白字符(我们的匹配)。
  4. 至少一个空白字符或输入结束。
  5. 只要正则表达式与字符串中的项目匹配,循环就会继续,从索引start开始,总是调整为指向当前匹配结束之后。