不贪心并且可选的逗号分割整个字符串

GeP*_*ePu 5 javascript regex

我有以下字符串:\n[Example] \xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f asdf 1234 (1a\xc3\xb6) (not necessary),

\n

解释:

\n

[Example] 可选,不需要

\n

\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x9f asdf 1234我需要的最重要的部分。每个字符、数字、特殊字符以及德语字符都\xc3\xa4\xc3\x84\xc3\xb6\xc3\x96\xc3\xbc\xc3\x9c\xc3\x9f可以在这里找到。
\n贪婪选择可能是防止像德国字符这样的字符的最佳解决方案,对吗?

\n

(1a\xc3\xb6)可选和必需的

\n

(not necessary)可选,不需要。如果出现的话可能是(not ...)或者(unusual)

\n

,逗号也可以是可选的。但也不需要。

\n

我使用以下正则表达式:/(?:\\[.*\\]\\s)?(?<name>.*?)(?:\\s\\([not|unusual].*?\\))?\\,/g

\n

问题:

\n
    \n
  1. 当我在逗号处使用可选参数时,?它将整个字符串拆分为单独的字符。

    \n
  2. \n
  3. 当我将组中的非贪婪选择更改name为贪婪选择时,可选逗号被分隔。但现在从 开始的示例字符串\xc3\xb6被选择到最后。

    \n
  4. \n
  5. 第一个标准括号内的字符串()可以以大写或小写开头。目前我只能识别大写字母。

    \n
  6. \n
\n

这是我对 regex101 的尝试,其中包含一堆示例: https: //regex101.com/r/Lx2anw/1

\n

很抱歉问了一个非常具体的问题,但我已经以我的知识结束了......

\n

有人对我在这里可以做什么有什么建议吗?

\n

Wik*_*żew 6

您可以使用

^(?:\[.*?]\s)?(?<name>.*?)(?:\s\((?:not|unusual)[^()]*\))?,?\s*$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

  • ^- 字符串的开头
  • (?:\[.*?]\s)?- 可选的序列[...]和空格
  • (?<name>.*?)- 组“名称”:任何零个或多个尽可能少的字符
  • (?:\s\((?:not|unusual)[^()]*\))?- 由空格、 、 或 组成的可选序列(not然后unusual是零个或多个字符(除了(和之外) ),然后是一个)字符
  • ,?- 可选的逗号
  • \s*- 零个或多个空格
  • $- 字符串结尾


The*_*ird 6

您的模式与组 1 中的其余行相匹配,因为组名称后面的模式中的所有内容都是可选的。

请注意,您使用字符类[not|unusual],但如果您想匹配替代方案之一,则应该使用分组,例如(?:not|unusual)

您还可以匹配除括号或字符串末尾的逗号之外的任何字符。

然后匹配括号之间的可选部分。

^(?:\[[^\][\n]*\]\s)?(?<name>(?:(?!,\s*$)[^\n()])*(?:\([^()\n]*\))?)
Run Code Online (Sandbox Code Playgroud)

解释

  • ^字符串的开头
  • (?:\[[^\][\n]*\]\s)?可选匹配[...]
  • (?<name>团队名字
    • (?:非捕获组
      • (?!,\s*$)[^\n()]如果我们不查看尾随逗号,则匹配除( )或 换行符之外的任何字符
    • )+关闭非捕获组并重复1次或多次以不匹配空行
    • (?:\([^()\n]*\))?可选择匹配以下部分(...)
  • )关闭群组名称

正则表达式演示

如果括号之间的第一部分不应以“not”“异常”开头,您可以使用否定前瞻对其进行断言(?!not\b|unusual\b)

^(?:\[[^\][\n]*\]\s)?(?<name>(?:(?!,\s*$)[^\n()])+(?:\((?!not\b|unusual\b)[^()\n]*\))?)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示


小智 5

如果您将不想匹配的每个表达式作为单个非捕获组放置,它将起作用。你的表情会是这样的:

/(?:\[.*\]\s)?(?<name>.+?)(?:\s\(not \w+\))?(?:\s\(unusual\))?,?$/gm
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/a7Qtvw/1