找到小写,然后立即大写

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

标签: regex text grep textwrangler

我的文字如下:

<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 个答案:

答案 0 :(得分:1)

一般来说,正则表达式不是解析HTML的好主意(如果它是一次性的,你可能没问题)。

我认为这可能是你的正则表达式不起作用的原因。 你能举例说明你的正则表达式失败了吗?

我可以想到一个案例是匹配的[a-z][A-Z]对中是否匹配(<font color=#0B610B></font>),但邻居<font></font>中的 。例如:

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

在这种情况下,有效匹配为<font color=#0B610B>word word</font><font color=#000000>word word和字符串Word</font>的其余部分,因此正则表达式匹配(因为它是否匹配)它会!)

我可以想到一个粗略的解决方法,但我不推荐它,除非这个任务是一次性的,因为使用HTML的正则表达式总是容易出现这样的错误!这个正则表达式也非常低效。尝试(未经测试):

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

它说,&#34;查找<font colour=xxxx>标记,然后是一个尖括号< 不是,后跟/font,或其他任何内容,然后再次跟随[a-z][A-Z]&#34;。 因此,它会尝试确保匹配不会越过</font>边界。