2012-01-08 3 views
0

Моего текста, как показано ниже:Найти Строчную сразу после прописных

<font size=+2 color=#F07500><b> [ba]</font></b> 
<ul><li><font color =#0B610B> Word word wordWord word.<br></font></li></ul> 
<ul><li><font color =#F07500> Word word word.<br></font></li></ul> 
<ul><li><font color =#0B610B> Word word word wordWord.<br></font></li></ul> 
<ul><li><font color =#0B610B> WordWord.<br></font></li></ul> 
<br><font color =#E41B17><b>UPPERCASE LETTERS</b></font> 
<ul><li><font color =#0B610B> Word word wordWord word.<br></font><br><font color =#E41B17><b>PhD and dataBase</b></font> </li></ul> 
<font color =#0B610B> Word word word.<br></font></li></ul><dd><font color =#F07500>  »» Word wordWord word.<br></font> 

Существует строчная буква сразу после заглавной буквы в каждом из <font color =#0B610B>...</font>. Например:

<font color =#0B610B> Word word wordWord word.<br></font> 

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

<font color =#0B610B> Word word word: Word word.<br></font> 

До сих пор я использую:

(<font color =#0B610B\b[^>]*>)(.*?</font>) 

для выбора каждого из экземпляров <font color =#0B610B>...</font>, и она отлично работает в поиске одного экземпляра на один экземпляр <font color =#0B610B>...</font>.

Но когда я использую:

(<font color =#0B610B\b[^>]*>)(.*?[a-z])([A-Z].*?</font>) 

это найти, но выбирает все между <font color =#0B610B>...</font> в одной строке, независимо от другого цвета шрифта тегов, и заменяет другие нежелательные экземпляры.

Я хочу, чтобы найти и заменить ошибку в каждом из этой конкретной пары тегов: <font color =#0B610B>...</font>, не захватывая все, начиная от <font color =#0B610B> и заканчивая </font>

Есть ли регулярные выражения для решения этой проблемы? Спасибо заранее.

ответ

1

В общем, регулярное выражение не является хорошей идеей для синтаксического анализа HTML (если это один раз, вы, возможно, все в порядке).

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

Один случая я могу думать, если есть совпадения нет ([a-z][A-Z]) в сопрягая <font color=#0B610B></font> пар, но в соседнем <font></font>. Например:

<font color=#0B610B>word word</font><font color=#000000>word wordWord</font> 

В этом случае только действует матч <font color=#0B610B>word word</font><font color=#000000>word word и остальная часть строки Word</font>, и так это то, что регулярное выражение соответствует

(так как если он может соответствовать его будет!)

Я могу подумать о грубом обходном пути, но я бы не рекомендовал его, если эта задача не будет отключена, поскольку использование регулярного выражения для HTML всегда подвержено таким ошибкам !. Это регулярное выражение также довольно неэффективно. Попробуйте (непроверенные):

(<font color =#0B610B\b[^>]*>)(([^<]|<(?!/font))*?[a-z])([A-Z].*?</font>) 

Он говорит, «искать <font colour=xxxx> тега, а затем либо угловой скобки <не с последующим /font, или что-нибудь еще, и снова следуют [a-z][A-Z]». Итак, он пытается убедиться, что совпадение не проходит через границу </font>.

+0

Спасибо, математика.кофе.Я думаю, это поможет мне, потому что кажется, что я нахожу то, что я хочу, но при замене на '\ 1 \ 2: \ 3 \ 4' совпадение меняется на' Слово слово: xWord '. Я не знаю, почему здесь добавляется символ ** x ** (** x ** может быть любой буквой). –

+0

Это потому, что есть дополнительный внутренний захват, '' 3 содержит один символ. Обратите внимание, что '\ 2' окружает' \ 3', поэтому замените на '\ 1 \ 2: \ 4'. –

+0

Превосходно! ты спас мой день, математика. Теперь он работает как шарм. Огромное спасибо. –

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