Найти строчные буквы сразу же после заглавных букв - PullRequest
0 голосов
/ 08 января 2012

Мой текст такой, как показано ниже:

<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 Ответ

1 голос
/ 08 января 2012

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

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

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

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

В этом случае допустимое совпадение only равно <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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...