首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用可选的pre和post字符串验证多种格式的Regex

使用可选的pre和post字符串验证多种格式的Regex
EN

Stack Overflow用户
提问于 2013-07-08 20:38:45
回答 3查看 1.4K关注 0票数 3

我试图以最有效的方式验证2种识别位置字符串的不同方法,但这两种方法都可能略有变化,并且在主字符串之前和之后都可以有一组字符。

有效值:

1号

代码语言:javascript
运行
复制
14-36-085-17 W6
14-36-085-17-W6
14-36-085-17W6

数字2

代码语言:javascript
运行
复制
D 096 H 094A15

以上任何一种都可以在主字符串之前有3位,在主字符串之后有2位(或不)。

代码语言:javascript
运行
复制
100 14-36-085-17W6 00
200 D 096 H 094A15 00

在这5个额外字符中,以下是规则:

  • 第一-总是1或2
  • 第二-总是0
  • 3-0至9
  • 第四-总是0
  • 5-0至9

因此,我认为这将分别是[1-2]0[0-9]0[0-9]。还请注意,前3位数字依赖于最后2位数字,反之亦然。前3位只能在最后2位存在的情况下才能出现,而最后2位只能在前3位存在的情况下才能出现。

这给出了以下不应该匹配的无效字符串:

代码语言:javascript
运行
复制
100 14-36-085-17W6
14-36-085-17W6 00

这是我的两个主要数字的代码

代码语言:javascript
运行
复制
function func(s) 
{
  var re = /(^\d{2}-\d{2}-\d{3}-\d{2}W\d$)|(^[A-D] [0-9]{3} [A-L] [0-9]{3}[A-P][0-9]{2}$)/;
  return re.test( s );
}

对于第一个验证,我只假设使用第3号大小写,因为我不知道如何使用空格、破折号或任何有效的东西。

EN

回答 3

Stack Overflow用户

发布于 2013-07-08 20:57:45

/^([1-2]0[0-9] )?[0-9]{2}-[0-9]{2}-[0-9]{3}-[0-9]{2}[- ]?W[0-9]( 0[0-9])?$/

第一个,和

/^([1-2]0[0-9] )?[A-D] [0-9] [0-9]{3} [A-L] [0-9]{3}[A-P][0-9]{2}( 0[0-9])?$/

为了第二个。我对regex不是很在行,所以我完全有可能在某个地方搞砸了。

票数 1
EN

Stack Overflow用户

发布于 2013-07-08 21:34:00

第一个数字类型可以与以下表达式匹配,这与您已经拥有的非常相似:

代码语言:javascript
运行
复制
/d{2}-\d{2}-\d{3}-\d{2}[ -]?W\d/
                       ^^^^^ 
                       added

我正在使用字符集[- ]?,它可以选择匹配空格或连字符。

额外字符

与左派匹配:

代码语言:javascript
运行
复制
/^[12]0\d /

右半部分:

代码语言:javascript
运行
复制
/ 0\d$/

现在大家齐心协力:

代码语言:javascript
运行
复制
/^(?:(?:[12]0\d )(?:\d{2}-\d{2}-\d{3}-\d{2}[ -]?W\d|[A-D] \d{3} [A-L] \d{3}[A-P]\d{2})(?: 0\d)|(?:\d{2}-\d{2}-\d{3}-\d{2}[ -]?W\d|[A-D] \d{3} [A-L] \d{3}[A-P]\d{2}))$/

让我们把它弄干净一点:

代码语言:javascript
运行
复制
var w1 = '\\d{2}-\\d{2}-\\d{3}-\\d{2}[ -]?W\\d',
w2 = '[A-D] \\d{3} [A-L] \\d{3}[A-P]\\d{2}',
words = '(?:' + w1 + '|' + w2 + ')',
prefix = '[12]0\\d ',
suffix = ' 0\\d',
re;

re = new RegExp('^(?:' + prefix + words + suffix + '|' + words + ')$');
票数 1
EN

Stack Overflow用户

发布于 2013-07-08 22:11:39

它其实并没有那么糟糕(虽然肯定是一个很大的指标)。这应该包括模式和在开始或结束时可能的额外数字。

下面是您需要的模式:

代码语言:javascript
运行
复制
var re = new RegExp("^([1-2]0\\d )?(\\d{2}-\\d{2}-\\d{3}-\\d{2}[\- ]?W\\d|[A-D] \\d{3} [A-L] \\d{3}[A-P]\\d{2})( 0\\d)?$");

。。。或者,交替地:

代码语言:javascript
运行
复制
var re = /^([1-2]0\d )?(\d{2}-\d{2}-\d{3}-\d{2}[\- ]?W\d|[A-D] \d{3} [A-L] \d{3}[A-P]\d{2})( 0\d)?$/

您的其余代码应该可以正常工作。

编辑:基于我对“全部或无”的新理解,我更新了我的方法。。。我将根据两种由普通模式构建的正则表达式模式进行两次测试。

代码语言:javascript
运行
复制
var sCorePattern = "(\\d{2}-\\d{2}-\\d{3}-\\d{2}[\- ]?W\\d|[A-D] \\d{3} [A-L] \\d{3}[A-P]\\d{2})";
var sSecondaryPattern = "[1-2]0\\d " + sCorePattern + " 0\\d";

var regCorePattern = new RegExp("^" + sCorePattern + "$");
var regSecondaryPattern = new RegExp("^" + sSecondaryPattern + "$");

if (regCorePattern.test(s) || regSecondaryPattern.test(s)) {
    . . . do stuff . . .
}
else {
    . . . do other stuff . . .
}

对我来说,这是效率和重用的一个很好的结合,而不牺牲可读性。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17535575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档