假设我有两个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”,“文字”,......]
你会如何做到这样的事情?
答案 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
,其打印为' '
)