簡體   English   中英

正則表達式以選擇與模式不匹配的所有字符

[英]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]

例如:

  • 12 34 56 A→好
  • 12 34 56 B→好
  • 12 34 5.6 A→錯誤選擇
  • 12 34 5.6 C→錯誤選擇 C
  • 1A 23 45 6→不良-選擇A6

編輯:由於我的印象是正則表達式用於同時執行字符和圖案/序列的驗證。 一個簡單的問題是如何選擇不適合非負數,空格和不同字符類別的字符。

答案1

簡要

由於正則表達式的性質,使用1個正則表達式無法真正實現。 此答案提供了一個正則表達式,它將捕獲最后一個不正確的條目。 對於多個不正確的條目,必須使用循環。 您可以通過所產生的捕獲組運行一些代碼邏輯,以確定為什么它是不是有效糾正不正確的條目。

我的最終建議是用已知的定界符(在本例中為空格字符)分割字符串 然后使用一些邏輯(甚至是小的正則表達式)來確定為什么不正確以及如何修復它,如答案2所示

不匹配

以下邏輯適用於我的第二個答案。

對於任何想知道我為捕獲不正確的匹配該怎么做的用戶:在最基本的級別上,此正則表達式所做的就是在正則表達式的每個子節中添加|(.*) 有些部分需要進行其他更改才能捕獲特定的無效字符串格式,但是|(.*)或對此稍加修改將很可能解決其他任何人的問題。

其他修改包括:

  • 使用相反的令牌
    • 例如:匹配一個數字
      • 原始正則表達式: \\d
      • 正則表達式\\D對面
    • 例如:匹配數字或空格
      • 原始正則表達式: [\\d\\s]
      • 正則表達式對面: [^\\d\\s]
        • 注意[\\D\\S] 不正確,因為它匹配兩組字符,因此,任何非空格或非數字字符(因為非空格包括數字,非數字包括空格,所以兩者都將匹配)
  • 負前瞻
    • 例如:一個月最多可捕獲31天
      • 原始正則表達式\\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中的零個字符之一( 08之間的數字),后跟任意數字
        • 9090字面上
      • (\\S*) ? 捕獲任何非空白字符一次或多次到捕獲組1中,然后捕獲零個或一個空格字符 從字面上看
  • (?:[AB]|(.*))匹配以下任一
    • [AB]匹配集合中存在的任何字符( AB
    • (.*)任意字符多次捕獲到捕獲組2中
  • $在行尾聲明位置


答案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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM