【问题标题】:Regex to match text between single, double and triple quotes正则表达式匹配单引号、双引号和三引号之间的文本
【发布时间】:2018-08-29 15:28:40
【问题描述】:

我有一个要从中解析字符串的文本文件。问题是在完全相同的文件中,字符串包含在单引号 (')、双引号 (") 或 3x 单引号 (''') 中。到目前为止我能得到的最好结果是使用这个:

((?<=["])(.*?)(?=["]))|((?<=['])(.*?)(?=[']))

只匹配单引号和双引号之间的单行字符串。请注意,文件中的字符串包含在每种类型的引号中,可以是单行或多行,并且每种类型的字符串在文件中重复多次。

这是一个示例字符串:

<thisisthefirststring
'''- This is the first line of text
- This is the second line of text
- This is the third line of text
'''
>

<thisisanotheroption
"Just a string between quotes"
>

<thisisalsopossible
'Single quotes

Multiple lines.

With blank lines in between
'
>

<lineBreaksDoubleQoutes
"This is the first sentence here

After the first sentence, comes the blank line, and then the second one."
>

【问题讨论】:

  • 你能分享一个示例字符串吗?
  • 抱歉,您的问题是什么?您基本上需要在您的正则表达式中添加''' 案例吗?
  • 另请注意,使用不情愿的量词 (.*?) 效率不高,请改用否定字符集。有关说明,请参阅 this answerthis answer
  • 我们不能等待 OP 的例子吗?你怎么知道什么是有效的,什么是无效的?
  • 没有示例字符串,没有语言或应用程序/工具标签(因为模式语法取决于它们),在 cmets 中没有问题的答案 = 以 太宽泛 结束问题。即使你努力建立一个模式并试图解释你的问题。

标签: regex


【解决方案1】:

使用这个:

((?:'|"){1,3})([^'"]+)\1

Test it online

使用组参考\1,您可以简化工作

此外,要仅获取引号 inside 的内容,请使用匹配的第二组

【讨论】:

  • 这是匹配 "''blah"''"""bla"""'"blah'"
  • 这与'''blah'blah'''不匹配
  • 谢谢你指点@Toto你是对的!但正如 UnbearableLightness 评论的那样,我会等待 OP 再进行任何更改,
  • 这在大多数情况下确实有效。但是,它也匹配引号,而理想情况下我只需要它们之间的字符串。
  • 也许这是纯(无需编程)正则表达式达到的极限。对于更复杂的替换,我喜欢使用:github.com/sl5net/SL5_preg_contentFinder
【解决方案2】:

这个正则表达式:('{3}|["']{1})([^'"][\s\S]+?)\1

做你想做的。

一些结果:

【讨论】:

  • 我在上面的正则表达式中发现了一个问题。它没有找到'"blah"'
【解决方案3】:

使用记事本++,可以使用:('''|'|")((?:(?!\1).)+)\1

说明:

('''|'|")           : group 1, all types of quote 
(                   : group 2
    (?:(?!\1).)+    : any thing that is not the quote in group 1
)                   : end group 2
\1                  : back reference to group 1 (i.e. same quote as the beginning)

这是结果的屏幕截图。

【讨论】:

    【解决方案4】:

    这里有一些对你有用的东西。

    ^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$
    

    将三重双引号替换为三重单引号。在regex101.com 上查看它的实际应用。

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多