2011-05-03 40 views
3

开头我正在解析一个文本文件,在每一行中运行,并且我在计算正则表达式时遇到了困难。部分解析涉及到发生的变化,如:正则表达式,找到一个字符串包含但不是以

& Eacute;到& eacute;

我试过以下的正则表达式,但它不返回任何东西:

/^(?!&)(É)/ 

有什么建议?

+0

当你设计一个正则表达式时,你不能使用“发生如”。你在寻找什么样的特定模式?它会一直是'&E'吗?你是否总是把它改成'&e'? – eykanal 2011-05-03 20:34:21

+0

假设我有以下几行:HÉ llo。我想改变它,所以它是一个小写的e。但是,如果线条以此开始,我不想更改它,因为我宁愿将其大写。我正在使用String类的gsub方法进行替换。 – agmcleod 2011-05-03 20:35:36

+0

你想得到什么? – fl00r 2011-05-03 20:35:58

回答

5

所以,只有当它不在行首时,你才想匹配É

使用

/(?<=.)&Eacute;/ 

(假设Ruby 1.9的,因为1.8不支持回顾后)

理由:.匹配除换行符任何字符。因此,如果lookbehind断言匹配,我们不在该行的开头。

+0

是的,这是诀窍:) – agmcleod 2011-05-03 20:41:13

+0

'(?!^)'应该可以在任何版本中工作。 – 2011-05-04 11:29:32

0

如果要上线的任何位置匹配&Eacute;,但不是在第一个位置:

/^.+(&Eacute;)/ 

此例如匹配"abc&Eacute;def",但不是"&Eacute;"

更新:修正了错误,指出由Tim

+0

这不起作用。它只在'&Eacute;'位于该行的位置2时才匹配。 – 2011-05-03 20:56:28

+0

@Tim你是对的,复制并粘贴错误。修复。非常感谢。 – 2011-05-04 06:21:06

+0

现在它只匹配在'&Eacute'之前在同一行上没有其他HTML实体... – 2011-05-04 06:29:02

2

如果您在使用Ruby 1.9,你可以使用一个回顾后是这样的:

t.gsub! /(?<=.)&Eacute;/, '&eacute;' 

在Ruby 1.8,你需要使用类似的方法:

while t =~ /(.)&Eacute;/ 
    t.sub! /(.)&Eacute;/, "#{$1}&eacute;" 
end 

其中t是要修改的字符串。

+0

't.gsub! /(?!^)&Eacute; /,'&eacute;'在Ruby 1.8中运行良好。 – 2011-05-04 11:33:21

相关问题