2013-09-25 50 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

相关问题