2009-11-09 3 views
1

мне нужно регулярное выражение, которое соответствует следующим образом (в скобках указывают я хочу, чтобы соответствовать этот раздел, они не существуют в реальной строки, чтобы быть согласованной!):Regex соответствие слова между пробельные символы

More Words: 
    6818 [some words]  641 [even more words] 

Я попытался это со следующим:

(?<=[0-9]+\s)[a-z\s]+(?!\s{2,})

Чтобы сказать, что в литералов; «Сопоставьте все слова, включая пробелы между ними, которые выходят за один пробел после 1 или более цифр и до 2 или более пробелов», но он выбирает все пробелы, а также иногда вырезает последнюю букву слова (wtf?)

+0

так что должно быть вашим окончательным результатом? – ghostdog74

+0

Множество реализаций регулярных выражений не поддерживают внешние образы, которые не имеют очевидной длины или даже переменной длины, поэтому шансы на это '[0-9] +' inside '(? <= [0-9] + \ s) 'является незаконным. Итак, мой вопрос (помимо того, что уже задали один призрачный призрак): на каком языке вы используете? –

+0

Извините, это забыл. Я использую C#, который, согласно wiki, и его собственная документация поддерживает как внешний, так и внешний вид. Моим конечным результатом должны быть детали, обозначенные [] в приведенном выше примере. (Конечно, скобки не включены, было бы слишком легко тогда, eh? :() –

ответ

-1

(?<=\d\s)([a-zA-Z]+\s)*[a-zA-Z]+

Это сделало трюк! Не спрашивайте, как я пришел в этот один, просто распушить вокруг ... Тем не менее, вы очень помогли :)

Для уточнения это регулярное выражение, краткое объяснение:

1: (    open group 1 
2: ?<=\d\s   look, if a digit followed by a whitespace are before group 2 
3:)    close group 1 
4: (    open group 2 
5: [a-zA-Z]+\s  match any words/letters that are followed by a whitespace 
6:)*    close group 2 and let it repeat or not even be there 
7: [a-zA-Z]+  match any words/letters and let them repeat one or more times 

длинная история Короче говоря, regex не пытается совместить слова между количеством пробелов, но соответствует чему-либо между цифрой/пробелом и словом/письмом :)

2

try

(?<=[0-9]+\s)([a-z]+\s)*[a-z]+(?!\s{2,}) 

@Bart: Я снял кронштейны.

Объяснение: Это позволит выбрать все слова следуют одним пробелом (если они существуют) плюс последнее слово не за которым следует пробел (который является обязательным)

+0

Много реализаций регулярных выражений не поддерживают обратные следы, которые не имеют очевидной длины или даже переменной длины, поэтому есть вероятность, что '[0-9] +' inside '(? <= [0 -9] + \ s) 'незаконно. –

+0

Работает неплохо, но теперь я получаю странное поведение, что иногда не выбрана последняя буква слова, например: [несколько слов] и [еще больше word] s –

2

это работает для меня

[0-9]+\s([a-z \s]+)\s\s 
+0

@ ApoY2k, просто возьмите то, что соответствует группе 1. –

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