iT邦幫忙

0

正則表達式要怎麼下

  • 分享至 

  • xImage

各位前輩好,我有三個測試案例分別為

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 都試用過,但還未篩出所需的結果。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
wiseguy
iT邦超人 1 級 ‧ 2022-05-31 22:49:57
最佳解答

有點看不懂你的問題。下圖結果是你要的嗎?是的話,RE 就是
-\d+(--\d+)*
囉。
https://ithelp.ithome.com.tw/upload/images/20220531/20055081OU2xSYvxP1.jpg

fgred iT邦研究生 1 級 ‧ 2022-06-01 06:24:28 檢舉

有 match 到,謝謝。

0
rainbowrain
iT邦新手 2 級 ‧ 2022-06-01 15:10:11

假如不看範例,單純看你想的邏輯 看到兩數字間有一個 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-']
fgred iT邦研究生 1 級 ‧ 2022-06-04 11:18:35 檢舉

感謝大神回答,一開始那一長串的表達式我還看不太懂/images/emoticon/emoticon02.gif,後來驗證時,的確有依照我說的邏輯這也有match到,而表達式中用了「?<=、?=、?<!、?!」我覺得用的不錯,非常感謝。

?<= ?<! 這個模式叫 lookbehind
?= ?! 這個模式叫 lookahead

詳細可以參考 這篇文章

要注意一下 lookbehind 目前在 IE 及 Safari 是不支援的
詳細可以參考 can i use lookbehind

那串 regex 拆解如下
(?<=\d)-(?=\d) : 找出前後都是數字的 - 且後面符合以下條件

(
[^-] : 不是 -, 這個條件是要讓數字及字母以外的符號也符合
-{2,} : 連續出現兩次以上的 - 符號
(?<!\d)(?<!-)-(?!-) : 前面不是數字且不是 -, 同時後面不是 - 的單一 - 符號
(?<!-)-(?!-)(?!\d) : 後面不是數字且不是-, 同時前面不是 --
-$ : 字串結尾的單一 - 符號
)
+ : 符合上面括號中條件的字符出現 1 次以上

如果確定要解析的資料格式都像你舉的例子,那其實也沒必要寫成這樣

不明
【**此則訊息已被站方移除**】

我要發表回答

立即登入回答