Как использовать регулярное выражение для извлечения бита в середине строки

Используя регулярные выражения PHP PCRE, я хочу извлечь центральную часть строки, где части могут встречаться или не встречаться. т.е.

n bedroom property type in some town

Я хочу извлечь «тип свойства», используя одно регулярное выражение. Я не знаю всех возможных типов собственности, но то, что последовательно, — это начальный бит (это всегда «\d спальня») и конечный бит (это всегда «в каком-то городе»). Кроме того, могут отсутствовать либо начальные, либо конечные биты (или оба).

т.е. строки темы могут быть одним из...

6 bedroom ground floor flat in Edinburgh

house in Manchester

3 bedroom apartment

Итак, вы хотите извлечь «квартиру на первом этаже», «дом» и «квартиру» соответственно.

Что-то вроде этого (что не совсем работает)....

(\s*\d+\s+bedrooms?\s*)?(.*?)(\s+in)?

person spiderplant0    schedule 25.09.2011    source источник
comment
соответственно с одним регулярным выражением. --- зачем вам одно уродливое и сложное регулярное выражение вместо нескольких простых и простых в обслуживании?   -  person zerkms    schedule 25.09.2011
comment
Я не могу писать произвольный PHP-код как часть фреймворка. Регулярное выражение передается анализатору, который принимает только одно регулярное выражение.   -  person spiderplant0    schedule 25.09.2011


Ответы (2)


Добавьте привязки к вашему регулярному выражению и объявите, что первая и последняя группа не будут захвачены:

/^(?:\s*\d+\s+bedrooms?\s*)?(.*?)(?:\s+in\s.*)?$/
person Toto    schedule 25.09.2011

Я думаю, что этот #(((?<bedroomCount>\d+)\s+bedroom)\s+)?(?<type>.+?)\s(in\s+(?<city>\w+))?\n#i работает, но вам нужна дополнительная новая строка в конце строки тестирования.

Пример здесь

person 3on    schedule 25.09.2011
comment
Спасибо 3on, но я не могу заставить его работать. Я не могу понять, что это за регулярное выражение: (?‹bedroomCount› - person spiderplant0; 25.09.2011
comment
(?<myVarName> это способ давать имена вашим совпадениям, это упрощает их использование в дальнейшем. Не все версии php поддерживают это. - person 3on; 25.09.2011