我正在使用Ruby进行一些文本处理。
对于我正在使用的一些文字:单引号永远不应该在双引号之外。所以,我想制作一个与单引号字符串匹配的RegEx,但不是那些用双引号括起来的字符串,所以我可以用脚本交换它们。有意义吗?
因此,在下面的例子中,句子#1,2,4,6和8都可以,而句子#3,5和7包含错误的嵌套单引号,我想交换:
(粗体表示我想用RegEx进行的匹配,所以我可以交换引号。)
关键点:我试图引用已经在其中引用的扩展段落。这需要我用双打交换他们的双打。
这可能吗?我已经尝试了几个小时,我似乎无法得到它。任何帮助表示赞赏。
答案 0 :(得分:2)
我认为正则表达式不适合这个。为什么不自己扫描文本?
(伪代码)
for each char in text
if char is `"`, then ignore until next `"`
else if char is `'` (and not part of a contraction), then capture until next `'` or `.`
end for
我预见到未来的问题。
答案 1 :(得分:1)
这可能不是一个完美的答案,但您可以尝试使用gsub
这样的#5:
a=> This is a sentence 'with a "nested double quote." Sometimes there are "more than one."'
a.gsub(/^[A-Z][a-zA-Z\s]*'[a-zA-Z\s]*(".*")[a-zA-Z\s]*'/) { |m| m.gsub('"',"'")}
对于#3使用:
a.gsub(/^[A-Z][a-zA-Z\s]*('.*')/) { |m| m.gsub('"',"'")}
等。为了其他人。
这些仅仅是示例,但希望它们有所帮助。我想你必须非常 小心这个因为根据你使用的数据和正则表达式,你可以得到 意想不到的结果,它可能会以某种方式改变您的数据 更差。确保编写一些rspec测试并使用非常大的测试 用最好的正则表达式来处理这个问题。
您可能遇到的另一个问题是识别句子是否在段落中。 它变得更加复杂,你可能需要使用像NLP这样的东西 识别它们。
此外,您可以考虑在代码中使用chr()
和ord()
。