2013-11-25 3 views
0

Я использую этот шаблон регулярного выражения = "(?ius)[(?<=\\s)]\\bgo\\b(?=\\s)".regex pattern: split() vs find()

Цель, если фильтровать команды t-sql с «go» в качестве разделителя.

Пример кода 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 

швы имеют проблемы, когда «идти» находится в конце строки или в начале. Если первый «ход» имел место после него, он работает. Я уже несколько раз пробовал несколько вещей. В моем случае мне действительно нужно использовать метод find(), я не могу просто полагаться на split, потому что мне нужно подтверждение, что «строка» как разделитель перед выполнением разделения.

+0

Я предположил, что вы имели в виду 'matches()' вместо 'matcher()', но теперь я не уверен, что это было правильно. Можете ли вы показать фактический код, который используете? –

+0

Я имел в виду подшивку(). См. Ниже ответ и комментарий. – HAT

+0

Хорошо, тогда я просто удалю это полностью.Метод 'matcher()' просто создает объект Matcher, поэтому вы можете вызвать его метод 'find()', поэтому вам не нужно упоминать об этом. –

ответ

0

Я думаю, я нашел решение

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

Этот шаблон швы нивелируют специальные символы, не отрицая начало и конец строки.

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 делает то же самое внутри.

+0

В моем коде я разбираюсь с каждой строкой отдельно. Кажется, что проблема связана с окончанием/началом строки. Попробуйте снова запустить код, но на этот раз с помощью String: String s = "select * from table1 go \ n" + "go select * from table2 go"; – HAT

+0

Ваш шаблон говорит, что после 'go' должно быть пространство, поэтому, если ваша строка заканчивается без символа после' go', шаблон не соответствует. То же самое происходит, когда вы удваиваете слово 'go' и имеете только один разделительный символ (прямую линию) между ними, поскольку он будет удален первым совпадением, и поэтому второй не может найти пробел перед словом. Но до сих пор нет разницы между 'find' и' split'. – Holger

0

Чтобы лучше прояснить эту проблему выше:

Проблема, кажется, не быть с расколом() отличен от согласовани(), проблема с регулярным выражением и начала и конца строки.

Мой код обрабатывает каждую линию отдельно, так что это было то, что меня обманывало.

Регулярное выражение "(? Ius) [(? < = \ s)] \ bgo \ b (? = \ S)" ​​не ловит начало «идти» и заканчивается «идти».

Идея ловит «целое слово», в этом случае слово «go», поэтому, если слово находится в начале строки или в конце, я все равно хочу включить его.

См. Пример и комментарий выше для уточнения.

Тем не менее нужно решить эту проблему, не имея большого успеха ...