Regex, чтобы найти строчную букву, а затем заглавную между тегом HTML - PullRequest
2 голосов
/ 07 января 2012

Я хочу использовать Регулярное выражение в TextWrangler, чтобы найти строчную букву, за которой следует заглавная буква между этими HTML-тегами font-color.Например:

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

На самом деле, я хочу, чтобы они были разделены двоеточием:

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

Я использовал:

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

Но этонаходит что-то между тегом font-color

Я также пробовал:

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

Но это не работает.

Может кто-нибудь помочь мне?Большое спасибо.

Ответы [ 5 ]

0 голосов
/ 29 августа 2012

Этот вопрос не был помечен как отвеченный. Если вы все еще не нашли адекватного ответа, вы можете попробовать это:

Учитывая следующие примеры, только строки 1, 2 и 3 должны «соответствовать» вашим критериям. Строка 4 должна НЕ совпадать, поскольку не существует комбинации «строчные буквы-прописные». Строка 5 также не должна совпадать, потому что цвет шрифта (#FFFFFF) не совпадает с тем, который вы указали (в OP, а также в последующих комментариях).

<font color =#0B610B> Word word wordWord </font>
<font color =#C0C0C0> Word word wordWord </font>
<font color =#C0C0C0> wordWord wordWordwordWord </font>
<font color =#0B610B> word word word Word Word Word Wordword </font>
<font color =#FFFFFF> Word word wordWord </font>

Поисковый термин может быть написан так:

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

Заменяющий термин может быть записан так:

\1: \2

Поисковый термин имеет несколько вложенных скобок. Первый, (?<...) находит тег "" слева, а затем начинает поиск с правой стороны от него. (?:0B610B|C0C0C0) находит любой из указанных вами цветов шрифта (вы можете добавить больше, добавив больше "|" каналов) и не сохраняет их в одном из регистров \ # (например, \ 1 или \ 2).

Затем есть 3 открытия (. Первая - это группа соответствия, которой будет сопоставляться с \1. Третий (пропуская 2-й на данный момент), который выглядит как (?!...), будет выглядеть так, что символы справа от текущего шаблона поиска НЕ ​​являются закрывающим тегом </font> и не являются символами новой строки. Хотя это условие истинно, символ . продвигает поиск до следующего символа, где он снова проверяет, чтобы убедиться, что </font> не найден. Он делает это, пока не найдет закрывающий тег </font>.

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

Наконец, в термине замены мы вставляем часть текста справа от тега в первое вхождение, где слово строчное и перед тем, как то же слово встречается с заглавным символом. Затем он просто входит в двоеточие, пробел и заканчивается. Возможно, вам придется выполнить эту замену несколько раз для случаев, когда в одной строке содержится wordWordWordWord.

0 голосов
/ 13 января 2012

Я не думаю, что вы можете сделать это в одном выражении Regex, но при условии, что вы можете пройти по нему:

<script type="text/javascript">
function checkscript() {
    var content = document.regexForm.input.value;
//match any HTML tag (you could specify font)(not an opening tag)(lowercase)(uppercase)(not an opening tag)
    while(content.match(/(<[^>]*?>)([^<]*)([a-z])([A-Z])([^<]*)/))
    {
        content = content.replace(/(<[^>]*?>)([^<]*)([a-z])([A-Z])([^<]*)/g,"$1$2$3: $4$5");
    }
    document.regexForm.output.value = content;
}
</script>
<body>

<form name="regexForm">
    <textarea rows="10" cols="50" name="input"> 
            <font color =#0B610B> Word myWord<BR> wordWord </font>
            <font color =#C0C0C0> Word word wordWord </font>
    </textarea>
<BR>    
<input type=button value="run test regex" onClick="checkscript();return true;">
<BR><textarea rows="10" cols="50" name="output"></textarea>
</form>

это:

<font color =#0B610B> Word myWord<BR> wordWord </font>
<font color =#C0C0C0> Word word wordWord </font>

становится:

<font color =#0B610B> Word my: Word<BR> word: Word </font>
<font color =#C0C0C0> Word word word: Word </font>
0 голосов
/ 07 января 2012

попробуйте

<font.*?>.*?[a-z][A-Z].*?</font>

0 голосов
/ 07 января 2012

Как насчет этого:

<font[^>]*>[^<>]*([a-z][A-Z])[^<>]*</font>
0 голосов
/ 07 января 2012

Как насчет позитивного взгляда вперед, что-то вроде этого

[a-z](?=[A-Z])

У меня нет text wrangler, но вы можете использовать это и сопоставить слово и добавить свои colon и space,Я проверил это regex в perl, и это выглядит нормально.

[jaypal:~/Temp] cat temp
<font color =#0B610B> Word word wordWord </font>
<font color =#C0C0C0> Word word wordWord </font>

[jaypal:~/Temp] perl -pe 's/([a-z])(?=[A-Z])/$1: /' temp
<font color =#0B610B> Word word word: Word </font>
<font color =#C0C0C0> Word word word: Word </font>

Обновление: я забыл, что у меня есть BBEdit, который является старшим братом Text Wrangler.Вот это в action .

Update2: Вот оно в action в Text Wrangler.

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