【问题标题】:Regex to find a lowercase letter followed by an uppercase between a HTML tag正则表达式在 HTML 标记之间查找小写字母后跟大写字母
【发布时间】:2024-01-17 05:49:01
【问题描述】:

我想在 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 =#0B610B\b[^>]*>([a-z])([A-Z])</font>

但它不起作用。

谁能帮帮我?非常感谢。

【问题讨论】:

  • 这可能是this question 的副本吗?上下文有点不同,但实际上是相同的问题。

标签: regex grep textwrangler


【解决方案1】:

像这样积极展望未来怎么样

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

我没有text wrangler,但您可以使用它并匹配单词并添加您的colonspace。我在perl 中测试了这个regex,它看起来还可以。

[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

【讨论】:

  • 不,似乎不在 TextWtangler 中。我试过 ([a-z])(?=[A-Z]) 但它没有运行。谢谢。
  • 它适用于文本管理员。看我的第二张快照。确保您选择了 grepcase-sensitivewrap around
  • 非常感谢,杰帕尔。我忘了告诉你,有一些例外(如千瓦,博士......)。但更重要的是,我只想编辑两个特定字体颜色标签()之间发生的内容。
【解决方案2】:

这个怎么样:

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

【讨论】:

  • 谢谢,但这没有找到任何匹配项。
  • 那么它一定是一个 textwrangler 特定的东西 - 我在 Notepad++ 和 Java 中用你的例子检查了这个。抱歉,我帮不上忙。
【解决方案3】:

试试这个

&lt;font.*?&gt;.*?[a-z][A-Z].*?&lt;/font&gt;

【讨论】:

  • 非常感谢,但这也不起作用。文本中还有其他字体标签,它会选择每一次出现。我尝试 .*?[a-z][A-Z].*? 但它不起作用。
【解决方案4】:

我认为你不能在一个单一的正则表达式中做到这一点,但前提是你可以循环遍历它:

<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>

【讨论】:

    【解决方案5】:

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

    鉴于以下示例,只有第 1、2 和 3 行应该“匹配”您的条件。第 4 行应该匹配,因为没有“小写-大写”组合。第 5 行也不应该匹配,因为字体颜色 (#FFFFFF) 与您指定的不匹配(在 OP 以及后续 cmets 中)。

    <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>

    搜索词可以这样写:

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

    替换词可以这样写:

    \1: \2

    搜索词有几个嵌套的括号。首先,(?&lt;...) 在左侧找到“”标签,然后从其右侧开始搜索。 (?:0B610B|C0C0C0) 查找您指定的字体颜色(您可以通过添加更多“|”管道来添加更多),并且不会将它们存储在 \# 寄存器之一(如 \1 或 \2)中。

    然后有 3 个开放的(。第一个是匹配组,\1 匹配。第三个(暂时跳过第二个)看起来像(?!...) 将看起来当前搜索模式右侧的字符不是结束&lt;/font&gt; 标记,也不是任何类型的换行符。当该条件为真时,. 字符将搜索推进到下一个字符,并再次检查以确保未找到 &lt;/font&gt;。它会一直这样做,直到找到 &lt;/font&gt; 结束标记。

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

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

    【讨论】: