Javascript 正则表达式捕获组至少包含 1 个非数字的两种形式:用空格分隔并用引号引起来

Jam*_*ner 2 javascript regex capturing-group

我正在尝试将category_id 用作纯数值,这有效。我还需要捕获category_name。对于category_name,我需要捕获直到空格或包含空格(如果它以双引号开头)。

用户输入字符串示例:

python c:192 c:1Stackoverflow c:"Stack Overflow2"
Run Code Online (Sandbox Code Playgroud)

所需的捕获应该是category_name 的这两个值和category_id 的192 值。

预期输出:

1Stackoverflow
Stack Overflow2
Run Code Online (Sandbox Code Playgroud)

Category_name 必须至少包含一位非数字,但可以是全字母且不含数字。

查询部分有效

python c:192 c:1Stackoverflow c:"Stack Overflow2"
Run Code Online (Sandbox Code Playgroud)

它不捕获输入1Stackoverflow,但捕获引用的输入。我需要删除引号:

1Stackoverflow
Stack Overflow2
Run Code Online (Sandbox Code Playgroud)

?!\d+是一种避免与category_id发生冲突的尝试,但似乎不起作用。

如何以两种形式(一个单词和引号分隔)捕获category_name,而不在捕获中使用引号并使用前导数字?

anu*_*ava 5

要在一个正则表达式中捕获所有 3 个命名组,请使用:

c:(?:(?<category_id>\d+\b)|("?)(?<category_name>(?:[^"\s]+|[^"]+))\2)
Run Code Online (Sandbox Code Playgroud)

更新了正则表达式演示

正则表达式细分:

  • c:: 匹配c:
  • (?::启动非捕获组
    • (?<category_id>\d+\b):命名捕获组category_id匹配 1 个以上数字,后跟字边界
    • |: 或者
    • ("?):匹配"或空字符串并在组 #2 中捕获
    • (?<category_name>[^"\s]+|[^"]+):命名捕获组category_name匹配 1 个以上非空格和非双引号字符或 1 个以上非双引号的任何字符
    • \2:匹配与我们在第 2 组中捕获的文本相同的文本,该文本是一个"字符串或空字符串
  • ):结束非捕获组