2017-01-23 68 views
5

我有一個任務來創建程序,匹配數字前面沒有數字。例如:正則表達式 - 只捕獲沒有旁邊有一個字母的數字

6X^2 + 6X + 6-57 + 8-9-90x

我試圖用正則表達式與+或捕捉到所有的數字 - 在他們面前 - 但沒有x之後。我試過

\[+-](\d+)[^x] 

,但它似乎捕捉到「-90」從「-90x」爲好。

+0

你知道正則表達式作爲匹配字符模式正在被搜索的字符串的模板。這意味着它是一個布爾函數。我不知道「捕獲」是什麼意思。 – yazanpro

+0

我希望它只是沒有找到X的數字,所以我可以代替他們。 – Netheous

+0

它捕捉'「-90''或在探微'」 90''從''-90x''?如果第一,這似乎並不正常,如果第二次,也許它capures最後的「X」,而不是首先是因爲有其他跡象「6X」後,使其與'^ x'匹配。它不能匹配'90x',因爲沒有其他字符。我認爲,'[^ X]'是錯在這裏 – Kaddath

回答

8

正確的正則表達式將是這樣的:

@"[+-]((?>\d+))(?!x)" 

替代非.NET解決方案:

[+-](\d++)(?!x) 

@" 
[+-]   // Prefix non captured 
(    // Begin capturing group 
    (?>   // Begin atomic (non-backtracking) group - this part is essential 
     \d+  // One or more digits 
    )   // End atomic group 
)    // End capturing group 
(?!    // Begin negative lookahead 
    x   // 'x' literal 
)    // End negative lookahead 
" 

您可以測試它here

+1

你是Godsent。 – Netheous

+0

如果你解釋了*爲什麼*,那麼這個答案會更好,也就是說,OP在他/她的表達中失敗了什麼。 –

+0

太好了。爲我正在尋找的'Atomic Group'+1。但我會添加一些使用正則表達式的解釋。 –

0

的主要問題與原來的正則表達式是所述[轉義並且因此字面[匹配,另一個問題是與(\d+)[^x]捕獲1+數字和捕獲到組1,然後一個[^x]匹配任何炭但x。這意味着它也可能匹配一個數字(如在你的情況下,與-90x,[+-]匹配-(\d+)匹配和捕獲9[^x]匹配0)。

一個更合適的正則表達式是爲包括\d圖案與x到負先行:

[+-](\d+)(?![\dx]) 

regex demo

圖案的詳細資料

  • [+-] - 要麼+-
  • (\d+) - 捕獲組1匹配1個或多個數字
  • (?![\dx]) - 失敗比賽如果1+數字的負先行後面跟着一個數字或x
相關問題