2016-08-02 5 views
1

У меня есть строка и требуется регулярное выражение для извлечения подстроки из строки.Регулярное выражение для извлечения текста, содержащего charcters

Пример: this is a|b|c|d whatever e|f|g|h
Результат: a|b|c|d, e|f|g|h

Однако на основе кода Java, что я написал, это производит результаты следующим образом:

Pattern ptyy = Pattern.compile("\\|*.+? "); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

Результат

this 
is 
a|b|c|d 
whatever 

Результат - это не то, что я надеялся р. Любой совет?

+2

Попробуйте ['/[^\s|]+(?:\|[^\||])+/g'](https://regex101.com/r/aL9bL4/1) –

+0

Вы только хотите отдельные буквы? Или должен соответствовать 'foo | bar | baz | qux'? Кроме того, это всегда ровно 4 термина, или должно 'a | b | c' соответствовать? – Bohemian

+0

Я также хочу найти foo | bar | baz | qux, foo2 | ba2r | baz | qux5 –

ответ

1

Ваш шаблон \|*.+? соответствует 0 или более трубам, затем 1 или более символов, кроме новой строки, до первого места. Таким образом, он соответствует почти всем не-белым фрагментам в строке.

Если a, b и c просто заполнители и могут быть любые не пробельные символы, я хотел бы предложить:

[^\s|]+(?:\|[^\s|])+ 

Смотрите regex demo

Детали:

  • [^\s|]+ - 1 или более символов, кроме пробелов и |
  • (?:\|[^\s|])+ - 1 или более последовательности:
    • \| - литерал |
    • [^\s|] - 1 или более другие, чем пробельные символы и |

Java demo:

Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 
2

Я думаю, что это регулярное выражение достаточно (.\|)+.

см example

(.\|) это найти все a|b|...| и последний . найти последний символ из подстроки.

0

Основываясь на вашем совете, мне удалось создать собственное регулярное выражение, которое может адресовать различную комбинацию выражения трубы.

Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whater e|f|g|h and Az|09|23|A3 and 22|1212|12121|55555"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

Это позволит мне получить результат

a|b|c|d 
e|f|g|h 
Az|09|23|A 
22|1212|12121|5 

Спасибо всем!

+0

Извините, но это * точно * регулярное выражение ** I ** предлагается в [моем ответе] (http: // stackoverflow.com/a/38716040/3832970). Если это работает для вас, нет смысла публиковать дублирующие решения. Пожалуйста, подумайте об удалении этого сообщения и принятии моего ответа. –

Смежные вопросы