【问题标题】:Getting text between quotes using regular expression使用正则表达式获取引号之间的文本
【发布时间】:2010-04-27 17:07:30
【问题描述】:

我正在创建的正则表达式存在一些问题。

我需要一个正则表达式来匹配以下示例,然后在第一个引用的字符串上进行子匹配:

输入字符串

("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")

必须子匹配

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

到目前为止的正则表达式:

\((["'])([^"']+)\1,?.*\)

正则表达式对第一组引号之间的文本进行子匹配,并返回上面显示的子匹配。

这几乎可以完美运行,但我遇到的问题是,如果引用的字符串在文本中包含引号,则子匹配在第一个实例中停止,见下文:

输入字符串失败

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

仅子匹配:Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

整个匹配失败。

备注

输入字符串实际上是 php 代码函数调用。我正在编写一个脚本,它将扫描 .php 源文件以查找特定函数并从第一个参数中获取文本。

【问题讨论】:

  • 为什么不直接使用反射 API?编辑:没关系...您的意思是您正在扫描实际脚本而不是函数/类/等..
  • 正确。我正在扫描源代码以查找上述字符串。

标签: php regex string


【解决方案1】:

试试这个正则表达式:

\(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\)

一些解释:

  • \(\s\* 匹配左括号和可选空格。
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*') 是匹配任何带引号的字符串,仅当使用\ 转义时才允许引号字符。
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))* 描述零个或多个引号字符串,前面是 ,,前面和后面都可以有空格。
  • \s*\) 将右括号与可选空格匹配。

【讨论】:

  • 无法让它充分发挥作用。我收到关于位置 46 缺少括号的错误?
【解决方案2】:

确保在转义时不匹配引号(前面有反斜杠):

/\((["'])([^"']+)[^\\]\1,?.*?\)/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2011-06-22
    • 2019-01-20
    • 2017-03-11
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多