2017-02-28 283 views
2

我想寫一個正則表達式,可以從字符串中提取不同類型的字符串+數字+符號組合。該類型的字符串我想提取的是:基於this正則表達式從字符串中提取字母數字+符號組合

avs-tldr-02 this is a test 
cc+asede this is a test 
x86_64 this is a test 

this is a test avs-tldr-02 this is a test 
this is a test cc+asede this is a test 
this is a test x86_64 this is a test 

this is a test avs-tldr-02 
this is a test cc+asede 
this is a test x86_64 

avs-tldr-02 
cc+asede 
x86_64 

我測試的邊緣案件類型是出現在開始,中間和句子的末尾這些字符串優秀的答案,我已經在正則表達式「環視」斷言周圍涉足,並拿出了以下內容:

(?=.*[:alnum:])(?=.*[:punct:])([a-zA-Z0-9_-]+) 

然而,這保持匹配S的第一個字特林 - 我明白爲什麼會發生這種情況,但是我不知道如何調整它以適合我的用例。

我該如何修改這個以獲得我正在尋找的東西/是否有其他解決此問題的方法?

+0

你可以只使用'strsplit'和'grep':'sapply(strsplit(S,\\ S +'),grep的,圖案= '[[:PUNCT:]]' ,value = TRUE)' – alistaire

回答

3

我用這個正則表達式

/([^\s]+?[-_+][^\s]+)/g 

我不熟悉[R,但經測試正則表達式是好看!https://regex101.com/r/Sxully/1

注:在「」或「執行給定的正則表達式」,要小心反斜槓和\\如果你想接受依賴於語言和使用

「_word_starting_by_underline」使用正則表達式:(它不會是有用的:))

/([^\s]*?[-_+][^\s]+)/g 
// ^^^^ + changed to * to support nothing before [-_+] 
+1

它的工作原理和它更容易理解。 –

+0

它的邏輯很簡單,至少一次不存在'\ s'並存在'[-_ +]'! – MohaMad

2

您的模式有幾個問題。像[:alnum:][:punct:]這樣的POSIX字符類必須位於括號表達式內才能被解析。另一件事是.*匹配任何字符(PCRE正則表達式中的換行符char除外),因此將導致過匹配,因爲如果在字符串中發現的超前預期模式比預期的要遠得多,它將返回true。

我建議使用

(?=[[:punct:]]*[[:alnum:]])(?=[[:alnum:]]*[[:punct:]])[[:alnum:][:punct:]]+ 

regex demo

詳細

  • (?=[[:punct:]]*[[:alnum:]]) - 在當前位置,必須有0+標點符號隨後以字母數字字符
  • (?=[[:alnum:]]*[[:punct:]]) - 在當前位置(與上面相同,前視是零寬度斷言,不會消耗文本),必須包含0+字母數字字符,後跟標點符號
  • [[:alnum:][:punct:]]+ - 1個或更多字母數字或標點符號。

如果您在比賽開始/結束時需要字母數字字符,您可以在兩端添加字邊界(\b)。