Java : Pattern matcher returns new lines unexpectedly

标签 java regex pattern-matching

我有一个用例,我必须处理任何转义/非转义字符作为分隔符来拆分句子。到目前为止,我们拥有的未转义/转义字符是:

" " (space),"\\t","|", "\\|",";","\\;","," etc

到目前为止,它使用正则表达式,定义为:

String delimiter = " ";
String regex = "(?:\\\\.|[^"+ delimiter +"\\\\]++)*";

输入的字符串是:

String input = "234|Tamarind|something interesting ";

现在,下面是拆分和打印的代码:

 List<String> matchList = new ArrayList<>(  );
 Matcher regexMatcher = pattern.matcher( input );
 while ( regexMatcher.find() )
 {
     matchList.add( regexMatcher.group() );
 }

 System.out.println( "Unescaped/escaped test result with size: " + matchList.size() );
 matchList.stream().forEach( System.out::println );

但是,意外地存储了额外的字符串(新行)。所以输出看起来像:

Unescaped/escaped test result with size: 5
234|Tamarind|something

interesting

.

有没有更好的方法来做到这一点,这样就不会有任何额外的字符串?

最佳答案

这很简单:确保至少匹配一个字符。这意味着您可以删除 ++ 量词并将 * 替换为 +。查看regex demo .

完整 Java demo :

String delimiter = " ";
String regex = "(?:\\\\.|[^"+ delimiter +"\\\\])+";
// System.out.println(regex); // => (?:\\.|[^ \\])+
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
String input = "234|Tamarind|something interesting ";
List<String> matchList = new ArrayList<>(  );
Matcher regexMatcher = pattern.matcher( input );
while ( regexMatcher.find() )
{
    // System.out.println("'"+regexMatcher.group()+"'");
    matchList.add( regexMatcher.group() );
}

System.out.println( "Unescaped/escaped test result with size: " + matchList.size() );
matchList.stream().forEach( System.out::println );

输出:

Unescaped/escaped test result with size: 2
234|Tamarind|something
interesting

关于Java : Pattern matcher returns new lines unexpectedly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122794/

相关文章:

mysql - 如何在 MySQL 中按字符串模式收集行?

performance - Scala 模式匹配性能

java - Jersey - 带有文本正文部分的多部分数据表单

java - String#split方法混淆

java - 如何为下面给出的查询编写 Java CriteriaBuilder

C# 使用常量加速解析器?虽然是抽象类

PHP 正则表达式将两个斜杠 (//) 替换为新行

java - 每次调用方法时 ArrayList 都会重新初始化

regex - Google Big Query 中 REGEXP_MATCH 的奇怪行为

RegEx - 在单字符之前匹配单词,而不是双字符?