Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查行是否与regex匹配_Regex_Vb.net_Io - Fatal编程技术网

检查行是否与regex匹配

检查行是否与regex匹配,regex,vb.net,io,Regex,Vb.net,Io,我有一个由服务器生成的文件-我无法控制该文件的生成或格式。我需要检查每一行以设置长度的字符串开始(在本例中为21个数字字符)。如果一行与该条件不匹配,我需要将其连接到前一行,并在读取和更正整个文件后保存它。我正在为目录中的许多文件执行此操作 到目前为止,我已经: Dim rgx As New Regex("^[0-9]{21}$") Dim linesList As New List(Of String)(File.ReadAllLines(finfo.FullN

我有一个由服务器生成的文件-我无法控制该文件的生成或格式。我需要检查每一行以设置长度的字符串开始(在本例中为21个数字字符)。如果一行与该条件不匹配,我需要将其连接到前一行,并在读取和更正整个文件后保存它。我正在为目录中的许多文件执行此操作

到目前为止,我已经:

       Dim rgx As New Regex("^[0-9]{21}$")

        Dim linesList As New List(Of String)(File.ReadAllLines(finfo.FullName))

        If linesList(0).Contains("BlackBerry Messenger") Then
            linesList.RemoveAt(0)
            For i As Integer = 0 To linesList.Count
                  If Not rgx.IsMatch(i.ToString) Then
                        linesList.Concat(linesList(i-1))
                 End If

            Next
        End If
        File.WriteAllLines(finfo.FullName, linesList.ToArray())[code]
在代码块之前和之后都有一个for语句来循环源目录中的所有文件,这很好


希望这篇文章读起来不会太糟糕:///p>我认为您的解决方案不太好,您在连接行时失败了。这里有一种不同的方法:

Dim rgx As New Regex("^[0-9]{21}")
Dim linesList As New List(Of String)(File.ReadAllLines(finfo.FullName))

' We will create a new list to store the new lines data
Dim newLinesList As New List(Of String)()

If linesList(0).Contains("BlackBerry Messenger") Then
    Dim i As Integer = 1
    Dim newLine As String
    While i < linesList.Count
        newLine = linesList(i)
        i += 1

        ' Keep going until the "real" line is over
        While i < linesList.Count AndAlso Not rgx.IsMatch(linesList(i))
            newLine += linesList(i)
            i += 1
        End While

        newLinesList.Add(newLine)
    End While
End If

File.WriteAllLines(finfo.FullName, newLinesList.ToArray())
Dim rgx作为新的正则表达式(“^[0-9]{21}”)
Dim LINES作为新列表列出(字符串)(File.ReadAllLines(finfo.FullName))
'我们将创建一个新列表来存储新行数据
Dim newlines作为新列表列出(字符串)()
如果linesList(0).包含(“BlackBerry Messenger”),则
尺寸i为整数=1
将换行符变暗为字符串
当我在名单上时,数一数
换行符=行列表(i)
i+=1
继续,直到“真正的”线结束
而i
您需要检查每一行是否以21位数字开头,但您将正则表达式锚定到了结尾——为什么?不,不应该有“$”…漫漫长夜!非常感谢。在
rgx.IsMatch(i.ToString)
上,它永远不会匹配,因为
i
是循环变量,
Integer
。我假设你的意思是
rgx.IsMatch(linesList(I))
?是的,你是对的。虽然循环作为rgx.IsMatch(linesList(i))工作,但我似乎还不能管理其余的循环。您应该发布一个数据文件的示例。所有的行都应该是21个数字字符,还是有些行根本不匹配,而不是因为它们被分割成两个连续的行?回答很好,我知道我完全错了……谢谢!