C#正则表达式无法按预期运行
我对Regex不熟悉。我的意见是:C#正则表达式无法按预期运行,c#,regex,C#,Regex,我对Regex不熟悉。我的意见是: 2233 0 0 20180405 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 此行仅允许使用制表符、数字、浮点、endofline/换行符构造 我读C#中的行内容: 然后我发送iteratedLine来验证函数。 我只允许以下表达式出现在字符串中: 1.选项卡 2.新行/行尾 3.数字
2233 0 0 20180405 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
此行仅允许使用制表符、数字、浮点、endofline/换行符构造
我读C#中的行内容:
然后我发送iteratedLine来验证函数。我只允许以下表达式出现在字符串中:
1.选项卡
2.新行/行尾
3.数字
4.浮动(0.123) 以下验证功能不起作用,我缺少什么
bool isValid = Regex.IsMatch(inputLine, @"(\d+\.{1}\d*)|(\d)|(\\t)|(\\n)|(\\r)");
如果我使用regex(\d+。{1}\d*)|(\d)|(\t)|(\n)|(\r)并在regex101.com中使用它的假定失败行,则这4个限制具有其他字符
感谢您使用的1,它在指定的输入字符串中查找匹配项。在您的正则表达式中,您可以使用替换项来查找匹配项,例如一个或多个数字。如果您的字符串还包含不需要的字符,则替换仍将匹配一个或多个数字,而不是生成的不需要的字符,isMatch仍将返回true
您可以使用锚定符断言行的开头,匹配一个或多个数字\d+
,后跟一个可选部分(?:\。\d+)
,该部分匹配一个点和一个或多个数字
然后匹配一个选项卡\t
,后跟多个数字,后跟一个可选部分,该部分匹配一个点和一个或多个数字,并断言行的结尾$
重复第二部分一次或多次,以便至少有两个值由选项卡分隔
您可以使用它在指定的输入字符串中查找匹配项。在您的正则表达式中,您可以使用替换项来查找匹配项,例如一个或多个数字。如果您的字符串还包含不需要的字符,则替换仍将匹配一个或多个数字,而不是生成的不需要的字符,isMatch仍将返回true
您可以使用锚定符断言行的开头,匹配一个或多个数字\d+
,后跟一个可选部分(?:\。\d+)
,该部分匹配一个点和一个或多个数字
然后匹配一个选项卡\t
,后跟多个数字,后跟一个可选部分,该部分匹配一个点和一个或多个数字,并断言行的结尾$
重复第二部分一次或多次,以便至少有两个值由选项卡分隔
您缺少几点:
^
,在结束处使用$
。否则,如果行的任何部分匹配,它都可以返回true;但我们只希望在整行与模式匹配时返回true^\d+(?:\.\d+)?(?:\t\d+(?:\.\d+)?)+$
如果您希望每行上有特定数量的值,可以将最后的+
替换为{x,x}
,其中x
是项目数减去一
另一种方法是使用
string.Split
并使用Linq检查所有项目是否从double.TryParse返回true您缺少几点:
您需要将正则表达式的两端锚定到字符串的两端,因此它需要在开始处使用^
,在结束处使用$
。否则,如果行的任何部分匹配,它都可以返回true;但我们只希望在整行与模式匹配时返回true
StreamReader的条带位于生产线的末端,因此您无需担心这一点
您需要强制在选项卡之间设置值,否则将只通过一行选项卡
这应该可以解决问题
^\d+(?:\.\d+)?(?:\t\d+(?:\.\d+)?)+$
如果您希望每行上有特定数量的值,可以将最后的+
替换为{x,x}
,其中x
是项目数减去一
另一种方法是使用string.Split
并使用Linq检查所有项目是否从double.TryParse
返回true。输入中的数据是否有任何顺序?是。只要用标签分开。。基本上,我读的是一个文件,每行包含制表符分隔的数字。我想验证行没有空格或wierd字符..因此您提供的输入应该失败,因为不仅仅有制表符作为分隔符,对吗?是的,这是真的。您能试试吗?输入中的数据可以按任何顺序吗?是的。只要用标签分开。。基本上,我读的是一个文件,每行包含制表符分隔的数字。我想验证该行没有空格或wierd字符..因此您提供的输入应该失败,因为不仅仅有制表符作为分隔符,对吗?是的,这是真的。您能试试吗?谢谢,我明天再试。空值可能在选项卡之间。我以前见过。我不想强制执行。我接收来自外部组件的输入。。。无法控制..如果值可能丢失,则需要调整我给出的表达式,将出现的\d+(?:\。\d+)
更改为括号内,后面是问号。谢谢,我明天再试。空值可能在选项卡之间。我以前见过。我不想强制执行。我接收来自外部组件的输入。。。无法控制..如果可能缺少值,则需要调整我给出的表达式,将\d+(?:\。\d+?
的两个匹配项都更改为在括号内,后跟一个问号。