2

我想在 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>

但它不起作用。

有人可以帮我吗?非常感谢。

4

5 回答 5

0

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

鉴于以下示例,只有第 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. 第三个(暂时跳过第二个)看起来像(?!...)当前搜索模式右侧的字符不是结束</font>标记,也不是任何类型的换行符。当该条件为真时,该.字符将搜索推进到下一个字符,并再次检查以确保</font>未找到该字符。它会这样做,直到找到</font>结束标记。

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

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

于 2012-08-28T22:34:10.777 回答
0

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

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

我没有,text wrangler但您可以使用它并匹配单词并添加您的colonand space。我对此进行了测试regexperl看起来还可以。

[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 的老大哥。这是它的行动

更新 2:这是 Text Wrangler 中的操作

于 2012-01-07T08:27:46.367 回答
0

尝试这个

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

于 2012-01-07T08:28:45.100 回答
0

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

<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>
于 2012-01-13T19:12:53.750 回答
0

这个怎么样:

<font[^>]*>[^<>]*([a-z][A-Z])[^<>]*</font>
于 2012-01-07T11:40:32.963 回答