1

我在这方面已经太久了,试图弄清楚如何匹配以逗号分隔的值字符串,同时将这些值分解为它们自己的捕获组。以下是我的要求:

  • 没有前导逗号
  • 术语可以是字母数字,包含 1 到 7 个字符
  • 最少:1个学期;最大:无限制
  • 术语和逗号之间的无限空格
  • 没有尾随逗号

我非常接近,但我无法将字符串中的所有术语都放入他们自己的捕获组中。相反,它将第一个捕获组中的最后一个匹配项放入组#1,而不是将所有匹配项放入先前的组中。所以这是我的例子:

abc1234、def5678、ghi9012

我希望 abc1234 成为第 1 组,def5678 成为第 2 组,ghi9012 成为第 3 组。相反,使用下面的表达式,我在组#1 中得到 def5678,在组#2 中得到 ghi9012。

/(?:([A-z0-9]{1,7})\s*,\s*)+([A-z0-9]{1,7})/g

链接到 RegExr 示例

我很确定我没有正确设置我的捕获/非捕获组。任何帮助将不胜感激。

4

1 回答 1

0

这可以为你做到。使用提取正则表达式,该值位于第 1 组中。该值也被修剪。
让我知道您是否需要引用字段。

请注意,对于 1-7 个字符的要求不能使用提取之一来强制执行,
除非提前验证。

验证正则表达式:

 # /^(?:(?:(?:^|,)\s*)[a-zA-Z0-9]{1,7}(?:\s*(?:(?=,)|$)))+$/

 ^    
 (?:
      (?:                           # leading comma + optional whitespaces
           (?: ^ | , )
           \s* 
      )
      [a-zA-Z0-9]{1,7}              # alpha-num, 1-7 chars
      (?:                           # trailing optional whitespaces
           \s* 
           (?:
                (?= , )
             |  $ 
           )
      )
 )+
 $ 

提取正则表达式。

 # /(?:(?:^|,)\s*)([^,]*?)(?:\s*(?:(?=,)|$))/


 (?:                           # leading comma + optional whitespaces
      (?: ^ | , )
      \s* 
 )
 ( [^,]*? )                    # (1), non-quoted field
 (?:                           # trailing optional whitespaces
      \s* 
      (?:
           (?= , )
        |  $ 
      )
 )
于 2014-09-26T18:32:19.660 回答