【问题标题】:Regex - extract string between double quotes where line starts with a keyword正则表达式 - 在双引号之间提取字符串,其中行以关键字开头
【发布时间】:2022-01-14 13:38:01
【问题描述】:

鉴于以下几行:

classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")

我希望提取text-xltext-blue-500text-sm 以及classes! 中可能的任何其他字符串

到目前为止我所拥有的是:

  • (?<=classes!).* - 这给了我课后的一切!但不是 确切的值
  • (?!^")".*?" - 这给了我想要的值,但带有引号
  • 我使用全局和多行标志

【问题讨论】:

  • 您只希望提取以“text-”开头的类吗?
  • @Dexygen 在双引号中没有任何内容,只要该行包含classes!()
  • 嘿,我开始寻找一个只寻找“text=”的解决方案,但现在我看到了其他好的答案。
  • 抱歉,可能应该说清楚!但无论哪种方式都感谢您的尝试

标签: javascript regex


【解决方案1】:

如果您使用的是 Javascript,并且支持正向后视(您不需要多行标志,只需全局标志)

(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")
  • (?&lt;= 正面向左断言
    • classes!\(匹配classes!(
    • (?:"[^"]*",\s*)* 匹配 "...", 的可选重复项
    • " 匹配双引号
  • ) 近距离观察
  • [^"]* 匹配除" 之外的可选字符
  • (?=") 断言" 向右

Regex demo

const regex = /(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")/g;
const str = `classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")
`;
console.log(str.match(regex))

【讨论】:

    【解决方案2】:

    您可以像这样尝试非固定宽度的lookbehind:

    (?<=^classes!\("(?:[^"]*"[^"()]*")*)[^"]*
    

    在线查看demo


    • (?&lt;= - 打开积极的后视;
      • ^classes!\(" - 起始行锚点并匹配字面上的 'classes!("';
      • (?:[^"]*"[^()"]*")* - 一个嵌套的非捕获组,用于匹配(0 次以上)除引号(和括号)之外的任何字符、引号和重复的相同序列。
      • ) - 近距离观察;
    • [^"]* - 匹配除引号之外的 0+ 个(贪婪)字符。

    【讨论】:

    • 谢谢,这也有效 - 不幸的是我无法为一个问题标记多个答案!
    • @itsezc,没关系。很高兴看到问题这么快就解决了。
    • (我认为如果classes!应该在同一行而不匹配String::from("test")你可以排除括号regex101.com/r/R7AVrL/1
    • @Thefourthbird,我现在明白你的意思了,因为我的模式仍然会拾取不需要的字符串。在答案中进行了修改。谢谢!
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2017-06-18
    • 2018-01-25
    • 2019-08-04
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多