2015-03-16 3 views
1

Мне сложно понять, почему ((?i)\bb.*?\b) возвращает b, а не b- для строки a b- c. Я также пробовал ((?i)\bb\w*\b), но это не работает лучше.. *? не соответствует символу до границы слова

Некоторые подробнее:

Мне нужно, чтобы соответствовать слова в тексте. Мне нужно получить все слова, начинающиеся с буквы b. И «слова» означают почти любую строку символов, которая начинается с b, например b, b-, b', b" и т. Д. «Слова», которые мне нужно сопоставить, конечно, не ограничены пространством, например, в этом примере.

+1

Это не значит, потому что у вас есть ленивое регулярное выражение '. *?'. Но чего же вы пытаетесь достичь? – bokibeg

+0

'.' "Соответствует любому символу, кроме \ n". '-' не является персонажем. '\ w' эквивалентен [a-zA-Z_0-9], который не включает' -' – SwDevMan81

+0

@bokibeg Добавлена ​​дополнительная информация ... – user1151923

ответ

1

Это должно дать вам желаемый результат:

(b.*?)(?:\s|$)

Я проверил его на a b- c bfdf b32=" dfa b. b---s asd b.

Похоже, вы не ищете слов, но любая строка, начинающаяся с буквы «b», разделенной пробелом (или другим символом?). Ваш исходный шаблон не может работать, потому что «-» не квалифицируется как часть слова. Удачи.

Примечание: над рисунком очень просто, последняя часть с $ существует, чтобы зафиксировать последний «b», который находится в конце строки.

0

.*? минимально, поэтому b.*?\b находит первую границу слова после b. Поскольку b является символом слова, а - не является, что граница первого слова находится между этими символами.

ETA: Thing is, regexen не считает ваши слова «словами», поэтому \b не будет работать на них. Вы говорите, что ваши слова не всегда заканчиваются пробелом. И, очевидно, они не заканчиваются дефисом. Как, точнее, они заканчиваются?

1

* называется «жадным» quantifier. Он будет соответствовать как можно большему количеству итераций предыдущего шаблона. Большую часть времени, это именно то, что вы хотите, но иногда вы хотите использовать «ленивый» квантор, то есть он будет соответствовать, как несколько как это возможно, в том числе 0.

Для того, чтобы квантор «ленивым» , добавьте знак вопроса: *?, +?, ?? и т.д.

Теперь следующая часть ответа заключается в том, как word boundaries работе. Границы слов будут соответствовать позиции , где есть «разрыв» между «символами слова» (0-9, a-z и _) и «символы без слов». - является символом, отличным от слова, поэтому позиции между b-, -c и c будут работать.

Поскольку у вас есть ленивый квантификатор и есть граница слова сразу после b, это все, что будет соответствовать вашему регулярному выражению.

Вместо того, чтобы использовать границу слова, чтобы найти конец вашего слова, просто соответствуют символы слов и тире, например, так, что, естественно, соответствовать все к «концу» слова:

\bb[-\w]* 

См. working example