正则表达式模式:split()vs find()

时间:2013-11-25 15:50:08

标签: java regex split

我目前正在使用此正则表达式模式= "(?ius)[(?<=\\s)]\\bgo\\b(?=\\s)"

目的是使用“go”作为分隔符来过滤t-sql命令。

示例t-sql代码:

select * from table1 go
select * from table2
go select * from table3

该模式适用于split()方法,但不适用于find()方法。

使用split()方法的示例结果:

select * from table1
select * from table2
select * from table3

使用find()方法的示例结果:

select * from table1 go
select * from table2
go select * from table3

当“go”位于行尾或开头时,它会出现问题。如果第一个“go”后面有一个空格,它就有效。我已经尝试了几件没有运气的事情。在我的情况下,我真的需要使用find()方法,我不能仅仅依赖于拆分,因为在进行拆分之前我需要确认“行”作为分隔符。

3 个答案:

答案 0 :(得分:1)

我无法重现您的问题:

String pattern="(?ius)[(?<=\\s)]\\bgo\\b(?=\\s)";
String s="select * from table1 go\n" + 
        "select * from table2\n" + 
        "go select * from table3";
for(String sub: s.split(pattern))
{
  System.out.println("sub: "+sub);
}
System.out.println();

Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(s);
int pos;
for(pos=0; m.find(); pos=m.end())
  System.out.println("sub: "+s.substring(pos, m.start()));
System.out.println("sub: "+s.substring(pos));

两种方式都会产生相同的结果。在这里找到差异会非常令人惊讶,因为String.split方法在内部做同样的事情。

答案 1 :(得分:0)

为了更好地澄清上述问题:

问题似乎与split()不同于matcher(),问题在于正则表达式以及字符串的开头和结尾。

我的代码分别处理每一行,这就是骗我的。

正则表达式“(?ius)[(?&lt; = \ s)] \ bgo \ b(?= \ s)”没有抓住开头“go”并结束“go”。

这个想法是抓住“整个单词”,在这种情况下单词是“go”所以如果单词在字符串的开头或结尾处,我仍然想要包含它。

请参阅上面的示例和评论以获得澄清。

仍然需要解决这个问题,没有太大的成功......

答案 2 :(得分:0)

我想我找到了解决方案

(?iu)[(?=\\s)]\\b(Go)|(^go)|(go$)\\b(?!\\S)

这种模式接缝可以否定特殊字符而不会否定行的开始和结束。