【问题标题】:Regular Expression to swap nested quotes?正则表达式交换嵌套引号?
【发布时间】:2013-01-04 17:44:06
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 到底要换什么?即,您希望转换后 3、5 和 7 的输出是什么?
  • 在语法上单引号和撇号有什么区别?我看不出你打算如何区分它们。
  • 会有多个嵌套的双引号字符串吗?
  • 在没有人脑的情况下区分 type5 更难。你有更严格的标准吗?
  • 一句话里有几个引号怎么样?会不会有类似的东西:this 'is' a 'string'

标签: ruby regex quotes


【解决方案1】:

我不认为正则表达式是解决这个问题的方法。为什么不自己浏览文本?

(伪代码)

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
【解决方案2】:

这可能不是一个完美的答案,但您可以尝试将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()

祝你好运!

【讨论】:

  • 这很有帮助。我去看看,然后回复你!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
相关资源
最近更新 更多