【问题标题】:Regular expression that match string without fixed length匹配没有固定长度的字符串的正则表达式
【发布时间】:2018-11-24 01:51:00
【问题描述】:

我有这样的字符串

01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120

那些字符串是datamatrix字符串,我必须以这种方式拆分字符串

0108470006981146 17190100 102853229 21DA192089940088

0108470008876389 17190500 10BM2120

每个块都以固定代码开头,后跟数字或字符

  • 01 + 14 位
  • 17 + 6 位数字
  • 10 + 1 到 20 个字符
  • 21 + 1 到 20 个字符

我尝试使用正则表达式来实现这一点,并且对于前两个块我没有问题,因为长度是固定的。我对第三个(和/或第四个)块有问题。

我创建了这个正则表达式

/^(01\d{14})(?:(17\d{6}))*(?:(10\w*))*(?:(21\w*))*$/

因为这个字符串是正确的

01084700088763891719050010BM2120

Group 1. 0108470008876389 (ok)

Group 2. 17190500 (ok)

Group 3. 10BM2120 (ok)

但对于其他字符串

01084700069811461719010010285322921DA192089940088

正则表达式匹配

Group 1. 0108470006981146 (ok)

Group 2. 17190100 (ok)

Group 3. 10285322921DA192089940088 (no)

我无法创建能够正确匹配第三个和第四个块的正则表达式,因为没有固定长度的字符,并且可能在第三个块中有字符串“21”也是下一个区块的起始码。

可以创建一个正确匹配字符串所有部分的正则表达式。

谢谢大家

【问题讨论】:

  • 如果这些块是连续的,请尝试^(01\d{14})(17\d{6})?(10\w{1,20})?(21\w{1,20})?$,并且bcd可以是可选的。
  • 第3和第4块以“10”和“21”开头,在正则表达式中用(?:(10\w))*(? :(21\w*))* 部分。第 3 块以“10”开头,可以在里面包含数字 21,但 21 也是第 4 块的起始码。两个块都没有固定长度
  • regex101.com/r/0p9Uz5/1。是你想要达到的吗?
  • 不错的镜头。似乎运作良好! :D 谢谢,你拯救了我的一天
  • 为什么0108470008876389 17190500 10BM 2120 无效?

标签: javascript regex alphanumeric


【解决方案1】:

你可以使用

^(01\d{14})(17\d{6})?(10\w{1,20})?(21\w{1,20})?$

regex demo

请注意,如果您打算量化捕获组,则不必将捕获组与非捕获组包装起来,您可以直接量化捕获组。

此外,要使组成为可选,使用 ? 量词就足够了,因为 * 匹配 0 次或多次出现。

模式详情

  • ^ - 字符串开头
  • (01\d{14}) - 第 1 组:01 和 24 位数字
  • (17\d{6})? - 第 2 组(可选):17 和 6 位数字
  • (10\w{1,20})? - 第 3 组(可选):10 和 1 到 20 个字字符
  • (21\w{1,20})? - 第 4 组(可选):21 和 1 到 20 个字字符
  • $ - 字符串结束。

请注意,要仅匹配字母数字字符,您需要将 \w 替换为 [^\W_],因为 \w 也匹配 _

【讨论】:

  • 我喜欢正则表达式,但也很危险:D。你有资源以这种方式掌握正则表达式吗?
  • @AngelPoyel 这种正则表达式知识不高,可以在regexone.com学习。从\w 中减去_ 有点“隐藏”,你可以在 SO 中学习。
【解决方案2】:

var inputValue = "01084700088763891719050010BM2120";

var regexpr = /(01\d{14})(17\d{6})(10[A-Za-z0-9]{1,20})(21[A-Za-z0-9 ]{1,20})/;

inputValue.replace(regexpr, "$1 $2 $3 $4");

输出将是:

“0108470008876389 17190500 10BM 2120”

var inputValue = "01084700069811461719010010285322921DA192089940088";

var regexpr = /(01\d{14})(17\d{6})(10[A-Za-z0-9]{1,20})(21[A-Za-z0-9 ]{1,20})/;

inputValue.replace(regexpr, "$1 $2 $3 $4");

输出将是:

“0108470006981146 17190100 102853229 21DA192089940088”

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 2019-01-04
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多