RegEx条件基于哪个字母

时间:2015-04-14 21:14:43

标签: c# regex

我有一个if语句,我试图将其压缩为正则表达式语句。 if语句如下:

 string degree = "21S"
 if (degree != "" && 
     Convert.ToInt32(degree) > 9 && 
     TChr == "N" || 
    degree != "" && 
    Convert.ToInt32(degree) > 41 && TChr == "S")

字符串将始终是一个数字,可以是SN(北/南)。如果是N,则该数字必须介于1-9之间,如果是S,则范围为1-41

我一直在尝试使用条件的范围:

^(?(/dN)[1-9]N|[1-51]S)$

然而,它没有抓到任何东西,所以我认为我会采取错误的方式。

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

\b(?:[1-9]N|(?:[1-9]|[1-3][0-9]|4[01])S)\b

var pattern = @"\b(?:[1-9]N|(?:[1-9]|[1-3][0-9]|4[01])S)\b";

这是demo

enter image description here

答案 1 :(得分:2)

正则表达式不是这项工作的最佳工具,因为使用正则表达式检查整数范围很困难。

除非你真的必须使用正则表达式,否则我只需要清理一下你所拥有的东西。它比可以执行相同操作的正则表达式更易读。

string input = "21S";
char direction = input.Last();
int degree = int.Parse(input.Trim('N', 'S'));
bool valid = ((direction == 'N' && degree >= 1 && degree <= 9) ||
              (direction == 'S' && degree >= 1 && degree <= 41);

答案 2 :(得分:1)

我认为你是在尝试这个:

^(?(?=\dN)[1-9]N|(?:4[01]|[1-3][0-9]|[1-9])S)$

...但你真的不需要这个任务的条件。这很好用:

^(?:[1-9]N|(?:4[01]|[1-3][0-9]|[1-9])S)$

此外,您无法将数字与正则表达式匹配(即,通过其数值)。字母,数字,标点符号等等,它们都只是字符。