各位前輩好,我有三個測試案例分別為
1、輸入字串為 1-2--3--4-5--6--7 結果要篩出 -2--3--4、-5--6--7
2、輸入字串為 1-2--3--4-5--6 結果要篩出 -2--3--4、-5--6
3、輸入字串為 1-2--3--4-5 結果要篩出 -2--3--4、-5
我的想法是當看到兩數字間有一個 dash 時,就知道其後面的片段內容我要抓起來,
但目前卡在後面的片段內容要如何抓呢?懇請正則大神邦幫忙。
目前我的正則表達式為 \d(-\d\S*)
使用 greedy 與 ungreedy 都試用過,但還未篩出所需的結果。
假如不看範例,單純看你想的邏輯 看到兩數字間有一個 dash 時,就知道其後面的片段內容我要抓起來
那我的 regex 會這樣寫
var regex = /(?<=\d)-(?=\d)([^-]|-{2,}|(?<!\d)(?<!-)-(?!-)|(?<!-)-(?!-)(?!\d)|-$)+/g
"1-2--3--4-5--6--7".match(regex)
=> (2) ['-2--3--4', '-5--6--7']
"1-2-----3--4-5---6---7-".match(regex)
=> (2) ['-2-----3--4', '-5---6---7-']
"-----1-2--3-4-ab-c0-5**6--7-8--9-".match(regex)
=> (4) ['-2--3', '-4-ab-c0', '-5**6--7', '-8--9-']
感謝大神回答,一開始那一長串的表達式我還看不太懂,後來驗證時,的確有依照我說的邏輯這也有match到,而表達式中用了「?<=、?=、?<!、?!」我覺得用的不錯,非常感謝。
?<=
?<!
這個模式叫 lookbehind?=
?!
這個模式叫 lookahead
詳細可以參考 這篇文章
要注意一下 lookbehind 目前在 IE 及 Safari 是不支援的
詳細可以參考 can i use lookbehind
那串 regex 拆解如下(?<=\d)-(?=\d)
: 找出前後都是數字的 -
且後面符合以下條件
([^-]
: 不是 -
, 這個條件是要讓數字及字母以外的符號也符合-{2,}
: 連續出現兩次以上的 -
符號(?<!\d)(?<!-)-(?!-)
: 前面不是數字且不是 -
, 同時後面不是 -
的單一 -
符號(?<!-)-(?!-)(?!\d)
: 後面不是數字且不是-
, 同時前面不是 -
的 -
-$
: 字串結尾的單一 -
符號
)+
: 符合上面括號中條件的字符出現 1 次以上
如果確定要解析的資料格式都像你舉的例子,那其實也沒必要寫成這樣