正则表达式在HTML标记之间找到一个小写字母后跟一个大写字母

时间:2012-01-07 08:21:38

标签: regex grep textwrangler

我想在TextWrangler中使用正则表达式来查找这些HTML字体颜色标记之间的小写字母,后跟大写字母。例如:

<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 :(得分:0)

如何做一个积极的展望,像这样

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

我没有text wrangler,但您可以使用此功能并匹配该字词并添加colonspace。我在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:这是Text Wrangler中的action

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

这个怎么样:

<font[^>]*>[^<>]*([a-z][A-Z])[^<>]*</font>

答案 3 :(得分:0)

我认为你不能在一个单一的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>

答案 4 :(得分:0)

此问题尚未标记为已回答。如果您还没有找到合适的答案,可以试试这个:

鉴于以下示例,只有第1,2和3行应与您的条件“匹配”。第4行应 NOT 匹配,因为没有“小写 - 大写”组合。第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)找到您指定的字体颜色(您可以通过添加更多“|”管道来添加更多),并且不会将它们存储在其中一个\ #register中(如\ 1或\ 2)。

然后有3个开放(。第一个是匹配组, \1匹配。第三个(现在跳过第2个)看起来像(?!...)将看起来当前搜索模式右侧的字符不是结束</font>标记,也不是任何类型的换行符。当该条件为真时,.字符会将搜索前进到下一个字符,然后再次检查以确保找不到</font>。它会在找到</font>结束标记之前执行此操作。

第二个(?:...)组的原因是我们不希望将搜索结果传递到任何寄存器:我​​们希望“&lt; font&gt; ...&lt; / font&gt;标记之间的所有内容“,但实际上不包括标签。

最后,在替换术语中,我们粘贴&lt; font&gt;右侧的文本部分。标记,第一次出现的单词是小写的,并且在同一个单词命中大写字符之前。然后它只是进入一个冒号,一个空格,并结束。对于单行包含wordWordWordWord的情况,您可能需要多次运行此替换。