我目前正在使用此正则表达式模式= "(?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()
方法,我不能仅仅依赖于拆分,因为在进行拆分之前我需要确认“行”作为分隔符。
答案 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)
这种模式接缝可以否定特殊字符而不会否定行的开始和结束。