用多个正则表达式解析字符串

时间:2014-09-04 17:42:29

标签: java regex string pattern-matching token

假设我有两个Java模式,一个用于在行的开头查找空格,另一个用于在行的开头查找非空格:

Pattern ws  = Pattern.compile("^\\s+");
Pattern nws = Pattern.compile("^\\S+");
String text = "\tSome \n\t text \n that needs \t parsing.";

我想遍历文本,将空格块和非空格块分开,从文本开头删除每个标记:

while(text.length() > 0) {
    String nextToken = "";
    try {
        //TODO: detect grouping and move it to nextToken.
    } catch (Exception e) {
        //TODO: error handling
    }
    if(nextToken.length() > 0)
        _tokens.add(nextToken);
}

我不只是想替换东西。 “\ tSome \ n \ t text \ n需要解析。”应分为[“\ t”,“某些”,“\ n \ t”,“文字”,......]

你会如何做到这样的事情?

3 个答案:

答案 0 :(得分:2)

您可以使用Scanner和单个Pattern来匹配任何一种令牌。

Pattern tokenPattern  = Pattern.compile("\\s+|\\S+");
String text = "\tSome \n\t text \n that needs \t parsing.";
List<String> tokens = new ArrayList<String>();
Scanner scanner = new Scanner(text);
while (true) {
    String token = scanner.findWithinHorizon(tokenPattern, 0);
    if (token == null) break;
    tokens.add(token);
}
System.out.println(tokens);

答案 1 :(得分:1)

这将删除开头时出现的所有空格或非空格字符

System.out.println(str.replaceAll("^(?:\\s+|\\S+)", ""));

答案 2 :(得分:1)

更新后,您的目标可能是将空格与非空格分开。在这种情况下,您应该拆分的地方可以使用look-around mechanisms的正则表达式来描述。换句话说,正则表达式应匹配具有

的地方
  • 之前的空白和之后的空白
  • 或之前的空格以及之后的非空白字符。

这样的正则表达式看起来像"(?<=\\s)(?=\\S)|(?<=\\S)(?=\\s)",您可以在split方法

中使用它
String text = "\tSome \n\t text \n that needs \t parsing.";
for (String s:text.split("(?<=\\s)(?=\\S)|(?<=\\S)(?=\\s)"))
    System.out.println("'"+s+"'");

另一方面,您可能也不想使用替换运算符 - OR,它由|find Matcher方法表示,以迭代文本和找到匹配的子串。

String text = "\tSome \n\t text \n that needs \t parsing.";

Pattern p = Pattern.compile("\\s+|\\S+");
Matcher m = p.matcher(text);
while(m.find())
    System.out.println("'"+m.group()+"'");

在两种情况下输出都是

'   '
'Some'
' 
     '
'text'
' 
 '
'that'
' '
'needs'
'    '
'parsing.'

(我用'包围了结果,以显示例如第一个结果确实包含制表符\t,其打印为' '