正则表达式交换嵌套引号?

时间:2013-01-04 17:44:07

标签: ruby regex quotes

我正在使用Ruby进行一些文本处理。

对于我正在使用的一些文字:单引号永远不应该在双引号之外。所以,我想制作一个与单引号字符串匹配的RegEx,但不是那些用双引号括起来的字符串,所以我可以用脚本交换它们。有意义吗?

因此,在下面的例子中,句子#1,2,4,6和8都可以,而句子#3,5和7包含错误的嵌套单引号,我想交换:

  1. 这是一句话。
  2. 这是一句“双引号”。
  3. 这是一个带有单引号的'句子。
  4. 这句话是“带有'嵌套单引号'。”有时会有'不止一个。'“
  5. 这是一个带有“嵌套双引号”的句子'。有时会有“不止一个。”'
  6. 这是一句“没有双重'结束语”,这在本文中很常见。
  7. 这是一句话',没有一个“结束语”,不幸的是也很常见。
  8. 但是,我不想匹配撇号。那不行。
  9. (粗体表示我想用RegEx进行的匹配,所以我可以交换引号。)

    关键点:我试图引用已经在其中引用的扩展段落。这需要我用双打交换他们的双打。

    这可能吗?我已经尝试了几个小时,我似乎无法得到它。任何帮助表示赞赏。

2 个答案:

答案 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()

祝你好运!