正则表达式:条件匹配后面的所有内容

3
我希望能够匹配一个包含零个或多个项目的列表中,在零个或多个项目之前(和之后)匹配所有内容。这是我目前正在使用的: (?<=\))(.*)(?=(or|,|\()) 在这种情况下,我想匹配右括号)后面的所有内容,在or,)之前的所有内容。这样做效果还不错(可能不是最优解),但是如果没有这三项中的任何一项匹配,就没有匹配结果。
例如,句子2 cups (500 ml) mushroom, or vegetable broth匹配mushroom,但是2 cups (500 ml) mushroom没有匹配任何内容。
基本上,我的目标是从成分+数量字符串中找到成分,上面的句子匹配mushroom,而句子salt匹配整个字符串salt
以下是更多示例:
1 thyme sprig应该匹配thyme sprig
1 garlic clove, chopped应该匹配garlic clove
1 cup (180 g) quinoa, rinsed and drained应该匹配quinoa
2 tbsp (30 ml) olive oil, plus more for serving应该匹配olive oil
Vegan Parmesan, to taste返回Vegan Parmesan 前两个和后两个之间的区别很棘手,因为如果有一个右括号(如在最后两个示例中),则成分应在右括号后面。如果没有右括号(如在前两个示例中),则应取出数字后面的所有内容。

你能提供更多的例子并说明应该返回什么吗? - user3783243
2个回答

1

您可以使用

(?:^[^)\n]*\)|\d)\s*\K.*?(?=or|[,(]|$)

如果您的正则表达式不支持\K,请使用捕获组:
(?:^[^)\n]*\)|\d)\s*(.*?)(?=or|[,(]|$)

查看正则表达式演示。获取第一组的值。

详细信息:

  • (?:^[^)\n]*\)|\d) - 要么是字符串开头,然后是零个或多个不是换行符或)字符的字符,然后是一个)字符,要么是数字(如果该行没有)
  • \s* - 零个或多个空格字符
  • (.*?) - 第1组:除换行符外的任何0+个字符,尽可能少
  • (?=or|[,(]|$) - 直到出现or,(或字符串结尾的第一个位置。

如何修改代码,使得“Vegan Parmesan, to taste”返回“Vegan Parmesan”,而不需要在食材名称前添加任何内容?在结尾处添加了一个示例。之前没有添加,非常抱歉。 - VincFort
1
@VincFort 我认为 ^(?:[^)\n]*\)|\d+)?\s*(.*?)(?=or|[,(]|$) 可以使用 - Wiktor Stribiżew

0

在结束组末尾添加|$(字符串结尾):(?<=\))(.*?)(?=(or|,|\(|$))

编辑:在测试此处后,我发现您还需要使主组非贪婪。


感谢您的回答。针对第一和第二个示例与最后两个示例之间的差异,我添加了一个精度。(?<=(\)|[\d]))(.*?)(?=(or|,|\(|$)) 对于前两个示例效果很好,但对于后两个示例无效。 - VincFort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接