2012-10-26 34 views
1

我有一個用例,我想在給定字符串中搜索<,>,< =,> =和=中的運算符,並將該表達式拆分爲2個部分即正確的表達式和左邊的表達式,並在評估最終的條件運算符之前單獨評估它們。在Java中使用正則表達式貪婪搜索字符串模式

這可以從下面的例子可以理解:

Pattern pattern1 = Pattern.compile("(.*?)(<|>|<=|=|>=)(.*)"); 
Matcher matcher2 = pattern1.matcher("4>=5"); 
while (matcher2.find()) { 
     System.out.println(matcher2.group(1) + ";" + matcher2.group(2)+ ";" + matcher2.group(3)); 
} 

輸出:

4;>;=5 

預期的輸出是4;>=;5>=操作者得到了分裂,因爲操作者>獨立地存在的。

我想以貪婪的方式評估條款(<|>|<=|=|>=),以便>=被視爲單個實體,並在它們一起出現時被列出。

+3

只要把它們放在正確的順序...(<=|> = | = |> | <)。這應該做你想做的。 –

+0

@羅伯特漢森 - 這是一個很好的。它有效,但如果我從列表中獲得這些運營商的列表,該怎麼辦。在這種情況下,我可能不確定訂單。我如何獨立於訂單? –

+0

@RobertHanson:您應該將其作爲答案發布! – ruakh

回答

1
String testt = "4>=5"; 
System.out.println(testt.replaceAll("(.*?)(>=?|<=?|=)(.*)", "$1;$2;$3")); 

容易理解,你會更換一次全部。如果在它之前找到<,那麼只需將那些2 < =和> =放到第一個地方即可。

+0

同樣的評論,因爲我對其他答案也一樣:如果我從未排序的數據結構中獲取運算符列表,該怎麼辦?如果不知道所有的操作員,我可能無法表達。 –

+0

那麼爲什麼不製作(operator1 | operator2)字符串(運行時),然後將其附加到正則表達式呢? '「(。*?)」+ operators +「(。*)」' –

+0

正是我想要做的,但1)我可能不確定操作符從未排序的數據結構中進來的順序,所以順序很可能是<,>,<=,> =因此也是同樣的問題。 2)我想讓它成爲運營商可能不相互關聯的動態事物。 –

2

你可以嘗試簡化到

pattern1 = Pattern.compile("(.*?)(>=?|<=?|=)(.*)"); 
+1

+1不錯的簡化。但是這對'4 = 5'不起作用。 –

+0

@shyam - 如果我從未排序的數據結構中獲取運算符列表,該怎麼辦?如果不知道所有的操作員,我可能無法表達。 –

+0

@AbhishekJain那麼你不應該使用正則表達式。如果你的一個操作員有一個具有特殊含義的角色作爲正則表達式呢? – shyam