2012-03-12 85 views
2

我有一個包含大量運算符,變量和英語單詞的文本輸入。從這個輸入我必須單獨分離所有操作員。匹配運算符

截至目前我正在使用正則表達式匹配,所以匹配的運算符的數量取決於正則表達式。我得到的問題是'=與< ='匹配,'&與& &'匹配。我需要分別匹配=和< =。

有沒有更好的方法來匹配除正則表達式之外的其他操作符?

回答

0

可能有。但是,作爲替代,你可以有你的正則表達式爲(例如):

[><=&|]+ 

(修改您的要求 - 不知道,如果你想加,減,++用於增加等也是如此)。

+的意思是「一個或多個」等正則表達式儘可能多的字符可能的匹配,這意味着如果<=是文本,它將匹配<=而不是<然後=

然後,只有當你已經提取的所有比賽中,遍歷所有這些,把它們歸類。

+0

thanx。我怎麼能錯過'+',它解決了我的大部分問題。現在我的問題看起來很愚蠢。 – gout 2012-03-12 05:56:15

+0

現在問題是「c = a +++ b」您的邏輯需要+++作爲單個運算符。需要抓住這一點。 – gout 2012-03-12 06:14:13

+0

使用替代方法,先將++作爲離散標記,然後在此處使用表達式。 – sweaver2112 2012-03-12 06:26:02

0

我想你可能仍然能夠得到正則表達式來做你想做的事情。

如果你想完全放棄它,請原諒我,如果你想使用正則表達式來檢測只是 =那麼你可以使用[^<>=]=[^<>=]無視我的建議:)

這意味着「只有在符合平等它不會在<>或其他=之前或分開。

您可以使用{1}&並符號來檢測一個(且只有一個)&符號。

(NB您可能需要逃避一對夫婦這些符號與\

我希望可以幫助。祝你好運。

K.

+0

對不起,如果我不清楚這個問題。我需要匹配=和<=分離。 as =是賦值運算符,<=是相關的。我需要匹配它們並保持它們的功能。 – gout 2012-03-12 05:46:33

+0

當然,在這種情況下,您可以爲每個操作員分別設置一個正則表達式,以查看它是否匹配。一個用於=,一個用於<=等 – 2012-03-12 05:54:59

2

至於正則表達式的話,你可以有圖案的特殊(化合物)的情況下先匹配,那麼包羅萬象的最後一個簡單的交替。在您的簡單輸入案例中:/<=|&&|=|&/。這並不一定是可怕的,你仍然可以把任何你包羅萬象的是之後:/special1|...specialN|special-chars-catch-all/

其中一個貪婪的表情只會讓整個事情,這樣的技術可以在某些情況下非常有用:if($x==-1),你會想==,不==-

+0

抱歉,我沒有正確地給你。你說我們可以使用正則表達式,比如「/ <= | && | ++ | - |&+ - <> = /」。 – gout 2012-03-12 09:01:56

+0

嗯,是的。 '|'的意思是「或」。並記住要轉義特殊字符(如+)。例如,'/ [<> =] = | && | \ + \ + | - | [&+ <> = - ] /'(和除法,乘法,模數,||等)。在較短的運營商之前運營商時間更長,並且逃避特殊字符 – 2012-03-12 09:47:56

+0

好的。得到它,並刪除該帖子,因爲你在這裏回答.. – gout 2012-03-12 10:01:35

1

看看你RE語言的擴展型。例如,(?![=])/將與「<」匹配,但不是「< =」,而不是「=」。在(?!...)表示 「後面時除外......」。這個術語是負超前進斷言。這些拼寫有時拼寫不同,因爲它們不如大多數其他編隊標準,但通常可用。他們從不消費更多的角色,但他們創造了較慢的匹配。

的「除非前面有」或負向後看斷言有時也可以,但你可能希望避免它。讀者很少清楚,可以創建較慢的匹配。

0

如果您執行多次傳球,您還可以找到複合運算符,然後在找到簡單運算符的傳球之前用其他字符替換它們。

無論如何,這通常是一種非常有用的方法:在處理時緩慢地覆蓋解釋的字符串,以便在完成後留下的內容只是令牌。 RE處理器通常返回索引範圍。因此,您可以輕鬆地返回並使用其他人以後不會匹配的內容覆蓋該範圍(如控制字符標記,NUL或代字號)。

一個好處是,您可以通過調試代碼進行驗證,以檢查是否沒有任何未解釋的東西。

+3

歡迎來到SO!沒有必要回答兩次。只需編輯一個答案(答案下方的小編輯鏈接)即可擴展它。總是試着判斷它是否值得另一個答案(更好地說:針對同一問題的解決方案採用不同的(!)方法)。對我來說,這個答案似乎更有可能擴展你的其他答案。 – 2014-01-13 17:33:11