2013-09-25 117 views
0

我試圖組合兩個Regular Expression模式來確定一個字符串是一個雙精度值還是一個變量。我的限制如下:正則表達式:確定一個字符串是數字還是變量

變量只能以_或字母開頭(A-Z,忽略大小寫),但後面可以跟零個或多個_s,字母或數字。

這是我到目前爲止,但我不能讓它正常工作。

String varPattern = @"[a-zA-Z_](?: [a-zA-Z_]|\d)*"; 
String doublePattern = @"(?: \d+\.\d* | \d*\.\d+ | \d+) (?: [eE][\+-]?\d+)?"; 

String pattern = String.Format("({0}) | ({1})", 
          varPattern, doublePattern); 
Regex.IsMatch(word, varPattern, RegexOptions.IgnoreCase) 

它似乎捕獲正則表達式模式,但我需要它是/或。

例如,_A2 2使用上面的代碼有效,但_A2無效。

有效變量的一些例子如下:

_X6,是_,A,Z_2_A

和無效的變量的一些例子如下:

2_X6,$ 2,T_2 $

我想我只需要澄清正則表達式的模式格式。我的格式不清楚。

+0

文本格式是否與您的文章完全相同?它是否逗號分隔?或者''字詞'之間還有另一個分隔符? – jmstoker

+0

對不起,逗號不是輸入的一部分。他們只是用來分隔我上面例子中的模式。 – Jonathan

+0

您可以舉一個原始文本如何格式化的例子嗎? – jmstoker

回答

2

如前所述,你把你的正則表達式字面空格的正則表達式的部分。除非正則表達式正在掃描的文本中有相同的空格,否則不會獲得匹配結果。如果你想使用空格作爲你的正則表達式,那麼你需要指定RegexOptions.IgnorePatternWhitespace,之後,如果你想匹配任何空格,你必須明確地這樣做,或者通過指定\s,\x20等。

需要注意的是,如果你確實指定了RegexOptions.IgnorePatternWhitespace,那麼你可以使用Perl風格的註釋(#來結束行)來記錄你的正則表達式(正如我在下面所做的那樣)。對於複雜的正則表達式,從現在開始的5年內有人可能是你—! —會感謝你的好意。

我認爲你的[推測是意圖的]模式比他們需要的更復雜。正則表達式匹配您所指定的標識符的規則是這樣的:

[a-zA-Z_][a-zA-Z0-9_]* 

分解成它的組成部分:

[a-zA-Z_]  # match an upper- or lower-case letter or an underscore, followed by 
[a-zA-Z0-9_]* # zero or more occurences of an upper- or lower-case letter, decimal digit or underscore 

的正則表達式匹配的數值的常規風格/浮點點文字是這樣的:

([+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)? 

分解成它的組成部分:

(  # a mandatory group that is the integer portion of the value, consisting of 
    [+-]? # - an optional plus- or minus-sign, followed by 
    [0-9]+ # - one or more decimal digits 
)  # followed by 
(  # an optional group that is the fractional portion of the value, consisting of 
    \.  # - a decimal point, followed by 
    [0-9]+ # - one or more decimal digits 
)?  # followed by, 
(  # an optional group, that is the exponent portion of the value, consisting of 
    [Ee] # - The upper- or lower-case letter 'E' indicating the start of the exponent, followed by 
    [+-]? # - an optional plus- or minus-sign, followed by 
    [0-9]+ # - one or more decimal digits. 
)?  # Easy! 

注:一些語法不同如對價值的符號是否是一元運算符或部分的價值 ,以及是否領先+標誌是允許的。語法也各不相同,以 像123245.是否有效(例如,是沒有小數位小數點有效?)

要結合這兩個正則表達式,

  • 首先,組他們每個人用括號(您可能要命名含氧基團,像我那樣):

    (?<identifier>[a-zA-Z_][a-zA-Z0-9_]*) 
    (?<number>[+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)? 
    
  • 接下來,結合日Ë交替操作,|

    (?<identifier>[a-zA-Z_][a-zA-Z0-9_]*)|(?<number>[+-]?[0-9]+)(\.[0-9]+)?([Ee][+-]?[0-9]+)? 
    
  • 最後,附上整個事情在@「......」字面,你應該是好去。

這就是關於它的一切。

+0

該信息非常有幫助,但問題仍然存在......如果某個角色處於無效狀態,該怎麼辦?例如,A_2_ $基於該正則表達式是有效的。有沒有辦法解決? – Jonathan

+1

根據該正則表達式,「A_2_ $'是如何有效的? **它的部分**是有效的:正則表達式將匹配所有內容,但不包括'$'。您可以使用元字符(例如'^'或'$')來錨定匹配。如果您匹配來自文本字段控件的輸入,其中控件的值必須與模式匹配,請將正則表達式錨定到字符串的開頭和結尾。例如,'^ foo $'只匹配**字符串'foo':它不會匹配'foo $','foobar','3foo'等等。當然,這種方法不起作用,如果你正在搜索一個文本的語料庫。 –

+0

這篇文章確實幫助我解決了這個問題。我找到了解決方案,並且非常接近您發佈的解決方案。有差異,但這讓我開始了。謝謝! – Jonathan

1

默認情況下,正則表達式中不會忽略空格,因此對於當前表達式中的每個空格,它都會在該字符串中查找空格。添加RegexOptions.IgnorePatternWhitespace標誌或從表達式中刪除空格。

您還需要添加一些字符串錨的開始和結尾(分別爲^$),因此您不僅僅匹配字符串的一部分。

1

除非明確設置IgnorePatterWhiteSpace,否則應避免在正則表達式中包含空格。爲了確保你只能得到完整的單詞匹配,你應該包括行首(^)和行尾($)字符。我也建議你建立整個表達模式,而不是像在這裏一樣使用String.Format("({0}) | ({1})", ...)

下面應該工作給你的例子:

string pattern = @"(?:^[a-zA-Z_][a-zA-Z_\d]*)|(?:^\d+(?:\.\d+){0,1}(?:[Ee][\+-]\d+){0,1}$)"; 
+0

該模式的唯一問題是它不會限制第一個字符之外的其他字符。例如,如果使用該模式,_A_ $有效。 – Jonathan

相關問題