1

我正在用 Ruby 做一些文本处理。

对于我正在使用的某些文本:单引号不应该在双引号之外。所以,我想制作一个匹配单引号字符串的正则表达式,但不是那些已经用双引号括起来的字符串,所以我可以用脚本交换它们。有道理?

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

  1. 这是一个句子。
  2. 这是一个“带双引号”的句子。
  3. 这是一个带有单引号的句子。
  4. 这是一个带有'嵌套单引号'的句子。有时会有‘不止一个’。”
  5. 这是一个带有“嵌套双引号”的句子。有时有“不止一个”。
  6. 这是一个句子“没有双'右引号',这在本文中很常见。
  7. 不幸的是,这句话“没有一个“结束引号”也很常见。
  8. 但是,我不想匹配撇号。那是行不通的。

(粗体表示我想用 RegEx 进行匹配,所以我可以交换引号。)

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

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

4

2 回答 2

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

我预见到未来的问题。

于 2013-01-04T18:01:48.140 回答
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()

祝你好运!

于 2013-01-04T23:10:46.150 回答