Regex字母数字动态块分组

2izufjch  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(84)

我需要你的帮助,因为我已经尝试了几种方法来创建一个可以按组获得的正则表达式,但是我遇到了一个我不知道如何考虑的变量:

字数:

589011 T CANNELLE FLAVOR 8
538160 TP0597C ORANGE FLAVOR
557137 APL0397C STRAWBERRY FLAVOR
556137 APL0397C STRAWBERRY FLAVOR
545129 1APL0397C MANGO FLAVOR
984320 TRANS DECENAL
533160 TP0597C ORANGE FLAVOR
530373 A PINEAPPLE FLAVOR
059311 A STRAWBERRY FLAVOR
508142 T LEMON FLAVOR
547261 A BLACKBERRY FLAVOR
536564 2T BLUEBERRY STRAWBERRY
055406 A MILK FLAVOR
054945 A BLACKBERRY FLAVOR
983347 SUSTANE
902040 ACETIC ACID

字符串

第一组:

589011 T
538160 TP0597C
557137 APL0397C
556137 APL0397C
545129 1APL0397C
984320
533160 TP0597C
530373 A
059311 A
508142 T
547261 A
536564 2T
055406 A
054945 A
983347
902040

第二组:

CANNELLE FLAVOR
ORANGE FLAVOR
STRAWBERRY FLAVOR
STRAWBERRY FLAVOR
MANGO FLAVOR
TRANS DECENAL
ORANGE FLAVOR
PINEAPPLE FLAVOR
STRAWBERRY FLAVOR
LEMON FLAVOR
BLACKBERRY FLAVOR
BLUEBERRY STRAWBERRY
MILK FLAVOR
BLACKBERRY FLAVOR
SUSTANE
ACETIC ACID


Regex测试:
1.第一个月

  1. ^([0-9\s]+(?:[A-Z0-9]+)?)\s(?:[A-Z\s]+)
    我对这两个词的困难在于,群体应该是这样的:
988320 TRANS DECENAL 1 KGM 12164500 JC4 20.0000 KILO 263.98/KG 5,279.60
903040 ACETIC ACID 1 KGM 12164500 DJ4 100.0000 KILO 3.17/KG 317.00

第一组:

988320
903040

第二组:

TRANS DECENAL
ACETIC ACID


而不是这样

第一组:

988320 TRANS
903040 ACETIC

第二组:

DECENAL
ACID

zrfyljdw

zrfyljdw1#

^(\d+\s?\b(?:[A-Z]|[A-Z]*\d[A-Z\d]*)?\b)\s*([A-Z ]*\b)

字符串
组1匹配数字,数字后面可选地跟随有单个字母的单词,或者包含字母和数字的混合物的单词,其中至少有一个数字。第2组得到所有后面只有字母的单词,除了它们之间的空格。
DEMO

juzqafwq

juzqafwq2#

你可以试试(regex101):

(\d{6}\s(?:[A-Z]\b|(?=\S*\d)[A-Z\d]+)?)\s*(.*)

字符串
这个会匹配

*第1组:6位数字+(可选)一个字符或多个字符与数字
*第2组:剩下的人

cgfeq70w

cgfeq70w3#

我假设组1和组2使用以下决策规则形成。

  • 该字符串必须在字符串的开头包含六位数字(字符串“1”),后跟一个空格,然后是由一个或多个字母和数字组成的字符串(字符串“2”);
  • 组1包括字符串1,后面跟着空格,如果字符串2后面跟着空格的两个示例,后面跟着由大写字母组成的单词,则后面跟着字符串2,这些示例后面跟着空格或在字符串的末尾,否则组1仅包括字符串1;和
  • 组2由跟在组1后面的空格后面的大写字母或数字的串,加上空格和由大写字母组成的单词的零个或更多个示例,尽可能多的这样的示例组成。

可以使用下面的正则表达式来实现这一点,其中捕获组1和2将分别包含组1和2(当然,前提是存在匹配)。

^(\d{6}(?: [A-Z\d]+(?=(?: [A-Z][A-Z\d]*){2}))?) ([A-Z]+(?: [A-Z]+)*)

字符串
Demo
这个正则表达式可以分解如下。

^
(                 # begin capture group 1
  \d{6}           # match 6 digits
  (?:             # begin a non-capture group
    [ ]           # match a space
    [A-Z\d]+      # match one or more (+) upcase ltrs or digits
    (?=           # begin a positive lookahead
      (?:         # begin a non-capture group
        [ ][A-Z]  # match a space followed by a upcase ltr
        [A-Z\d]*  # match zero or more (*) upcase ltrs or digits
      ){2}        # end non-capture group and execute twice 
    )             # end positive lookahead
  )?              # end non-capture group and make it optional
)                 # end capture group 1
[ ]               # match a space
(                 # begin capture group 2
  [A-Z]+          # match one or more (+) upcase ltrs
  (?:             # begin a non-capture group
    [ ]           # match a space
    [A-Z]+        # match one or more (+) upcase ltrs
  )*              # end non-capture group and make it optional
)                 # end capture group 2


在上面我把每个空格字符表示为一个包含空格的字符类,只是为了使空格可见。

相关问题