![](/img/trans.png)
[英]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.