[英]Regex - How do I match all groups of characters that both do and do not match a pattern?
[英]Regex to select all characters that do not match a pattern
我对正则表达式不满意,但是将以下正则表达式放在一起,可以在遇到我的模式时选择它,问题是我需要选择任何不适合该模式的字符。
/^\d{1,2}[ ]\d{1,2}[ ]\d{1,2}[ ][AB]/i
正确的方式是:
## ## ## A|B aka [0 < x <= 90]*space*[0 < x <= 90] [0 < x <= 90] [A|B]
例如:
编辑:由于我的印象是正则表达式用于同时执行字符和图案/序列的验证。 一个简单的问题是如何选择不适合非负数,空格和不同字符类别的字符。
由于正则表达式的性质,使用1个正则表达式无法真正实现。 此答案提供了一个正则表达式,它将捕获最后一个不正确的条目。 对于多个不正确的条目,必须使用循环。 您可以通过所产生的捕获组运行一些代码逻辑,以确定为什么它是不是有效纠正不正确的条目。
我的最终建议是用已知的定界符(在本例中为空格字符)分割字符串 然后使用一些逻辑(甚至是小的正则表达式)来确定为什么不正确以及如何修复它,如答案2所示 。
以下逻辑适用于我的第二个答案。
对于任何想知道我为捕获不正确的匹配该怎么做的用户:在最基本的级别上,此正则表达式所做的就是在正则表达式的每个子节中添加|(.*)
。 有些部分需要进行其他更改才能捕获特定的无效字符串格式,但是|(.*)
或对此稍加修改将很可能解决其他任何人的问题。
其他修改包括:
\\d
\\D
对面 [\\d\\s]
[^\\d\\s]
[\\D\\S]
不正确,因为它匹配两组字符,因此,任何非空格或非数字字符(因为非空格包括数字,非数字包括空格,所以两者都将匹配) \\b(?:[0-2]?\\d|3[01])\\b
\\b(?![0-2]?\\d\\b|3[01]\\b)\\d+\\b
首先,根据OP的问题,创建一个更正确的正则表达式,也可以确保0 < x <= 90
。
^(?:(?:[0-8]?\d|90) ){3}[AB]$
^(?:(?:(?:[0-8]?\d|90) |(\S*) ?)){3}(?:[AB]|(.*))$
注意 :此正则表达式使用mi
标志(多行-假定输入采用该格式,并且不区分大小写)
实际上,以下正则表达式将是理想的。 不幸的是,JavaScript不支持正则表达式中使用的某些令牌,但我认为它对OP或其他看到此问题的用户很有用。
^(?:(?:(?:[0-8]?\d|90) |(?<n>\S*?) |(?<n>\S*?) ?)){3}(?:(?<n>\S*) )?(?:[AB]|(.*))$
第一部分(由多余的换行符/换行符分隔的部分)显示有效字符串,第二部分显示无效字符串。
0 45 90 A
0 45 90 B
-1 45 90 A
0 45 91 A
12 34 5.6 A
12 34 56 C
1A 23 45 6
11 1A 12 12 A
12 12 A
12 12 A
0 45 90 A VALID
0 45 90 B VALID
-1 45 90 A INVALID: -1
0 45 91 A INVALID: 91
12 34 5.6 A INVALID: 5.6
12 34 56 C INVALID: C
1A 23 45 6 INVALID: 1A, 6
11 1A 12 12 A INVALID: 12 A
12 12 A INVALID: (missing value)
12 12 A INVALID: A, (missing value)
注意 :最后一个条目显示了一个奇怪的输出,但这是由于JavaScript的正则表达式引擎的限制所致。 “ 其他格式”部分介绍了此方法以及用于正确捕获这些情况的另一种方法(使用其他正则表达式引擎)
这使用一个简单的|
(OR),并将不正确的匹配项捕获到捕获组中。
^
在行首处声明位置 (?:(?:(?:[0-8]?\\d|90) |(\\S*) ?)){3}
精确匹配以下3次
(?:(?:[0-8]?\\d|90) |(.+))
匹配以下任一
(?:[0-8]?\\d|90)
匹配以下任意一个,后跟一个空格
从字面上看
[0-8]?\\d
匹配字符集0-8
中的零个字符之一( 0
到8
之间的数字),后跟任意数字 90
赛90
字面上 (\\S*) ?
捕获任何非空白字符一次或多次到捕获组1中,然后捕获零个或一个空格字符
从字面上看 (?:[AB]|(.*))
匹配以下任一
[AB]
匹配集合中存在的任何字符( A
或B
) (.*)
任意字符多次捕获到捕获组2中 $
在行尾声明位置 此方法在给定的定界符上分割字符串,并在每个部分测试正确的字符集。 如果值不正确,它将输出一条消息。 您可能会用想要使用的任何逻辑替换控制台输出。
var arr = [ "0 45 90 A", "0 45 90 B", "-1 45 90 A", "0 45 91 A", "12 34 5.6 A", "12 34 56 C", "1A 23 45 6", "11 1A 12 12 A", "12 12 A", "12 12 A" ]; arr.forEach(function(e) { var s = e.split(" "); var l = s.pop(); var numElements = 3; var maxNum = 90; var syntaxErrors = []; if(s.length != numElements) { syntaxErrors.push(`Invalid number of elements: Number = ${numElements}, Given = ${s.length}`); } s.forEach(function(v) { if(v.match(/\\D/)) { syntaxErrors.push(`Invalid value "${v}" exists`); } else if(!v.length) { syntaxErrors.push(`An empty value or double space exists`); } else if(Number(v) > maxNum) { syntaxErrors.push(`Value greater than ${maxNum} exists: ${v}`); } }); if(l.match(/[^AB]/)) { syntaxErrors.push(`Last element ${l} in "${e}" is invalid`); } if(syntaxErrors.length) { console.log(`"${e}" [\\n\\t${syntaxErrors.join('\\n\\t')}\\n]`); } else { console.log(`No errors found in "${e}"`); } });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.