2017-03-06 26 views
2

我已經搜索幾個職位試圖找出一種方法來檢索表達式的每個詞和運營商類似如下:匹配和使用組每個詞和表達的運營商正則表達式

`now`+`1 day`-`2 days` 

對於這種表情,我d喜歡有5組:現在,+,1天, - ,2天。

正則表達式我已經想出如下:

`(never|now|\d+\s+(?:millisecond|second|minute|hour|day|year)s?)`(?:\s*(\+|\-)\s*`(never|now|\d+\s+(?:millisecond|second|minute|hour|day|year)s?)`)* 

然而,與此正則表達式,我只得到三組:現在, - ,2天。爲了讓表達式中的每一個術語和操作符都做出什麼改變?請考慮表達式應該有n條款和n-1運算符實例。

我真的很感謝你的幫忙!乾杯!

+0

見https://regex101.com/ r/fMpLgI/1 –

回答

1

這將是更容易使用Java的字符串分割方法:http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-

例如:

String blah = "`now`+`1 day`-`2 days`"; 
String[] blahArray = blah.split("`"); 

的blahArray將包含: 「」, 「現在」, 「+」, 「1日」, 「 - 」, 「2日」]

+2

這種方法的缺點是你必須做數據驗證作爲一個單獨的步驟,而不是將驗證與標記化相結合。但保持兩者分開有時會更簡單。 –

+0

好點帕特里克! – Joe

+1

這幫助我意識到我的問題其實很愚蠢!由於沒有人使用正則表達式提出答案,所以我決定在之前的步驟中驗證我的數據,然後使用@Joe建議的方法對其進行標記。不過,如果有人能爲此提供一個正則表達式,我會非常高興:) – igorcadelima

0

正則表達式可以匹配諸如您所詢問的術語之類的術語,但是他們無法像您所詢問的那樣捕獲組。

當捕獲組包含在重複模式中時,捕獲組將僅包含匹配的最後一個字符串。

實施例:(\d)+將匹配0123和第一捕獲組將具有在它3

使用java,你可以使用諸如find之類的東西在循環中沿着你的字符串走。 Find example

0

只要在這兩個字符類添加操作數,如果超過+-的支持,那麼這應該做的工作:

String input = "`now`+`1 day`-`2 days`"; 
String pattern = "[+-]|[^+-]*"; 
Matcher matcher = Pattern.compile(pattern).matcher(input); 
while (matcher.find()) { 
    System.out.println(matcher.group().replace('`', ' ').trim()); 
} 

這將打印

now 
+ 
1 day 
- 
2 days 
+1

只要您的操作員不被允許出現在引用的值內,就會工作。 –

+0

這是真的;-) – jlordo