正则表达式,用于检测一行字符串中模式的开始和结束

时间:2015-06-26 01:43:12

标签: regex vb.net

问题: 我想创建一个正则表达式来检测' M'在开始时寻找' ^'作为结束。我的问题是我希望我的正则表达式只检测单行字符串中的所有实例,然后输出它们。

示例:

字符串:M123456789 ^ M123 ^ C123 ^ M1234 ^

输出应为:

  1. M123456789 ^
  2. M123 ^
  3. M1234 ^
  4. Notice that I reject 'C123^' because it doesnt start on 'M'.

    到目前为止,我在这里有一个正常的表达式来检测' M'但是我在操作它时遇到了问题。

    这是我的代码:

    Sub Main()
        Dim str As String = "MLIVEOKK0S0^MRNS02K0S0^CKILL^"
        Console.WriteLine("Matching words that start with 'S': ")
        showMatch(str, "\b^\S*")
        Console.ReadKey()
    End Sub
    
    Sub showMatch(ByVal text As String, ByVal expr As String)
        Console.WriteLine("The Expression: " + expr)
        Dim mc As MatchCollection = Regex.Matches(text, expr)
        Dim m As Match
        For Each m In mc
            Console.WriteLine(m)
        Next m
    End Sub
    

3 个答案:

答案 0 :(得分:1)

尝试这种模式

"(M [^ \ ^] + \ ^)"

模式分解:

  • (M [^ \ ^] + \ ^) - 以M开头并以^结尾的捕获组
    • [^ \ ^] + - 匹配一个或多个非^
    • 的字符

代码示例:

M123456789^
M123^
M1234^

结果:

Imports System

Public Module Module1
    Public Sub Main()
        Dim data As String = "M123456789^M123^C123^M1234^"

        Dim mIndex = data.IndexOf("M")
        Dim caretIndex = data.IndexOf("^", mIndex + 1)

        While mIndex > -1
            If (caretIndex > -1)
                Console.WriteLine(data.Substring(mIndex, caretIndex - mIndex + 1))
            Else 
                Console.WriteLine(data.Substring(mIndex))
            End If

            ' Search for the next match
            mIndex = data.IndexOf("M", caretIndex)
            caretIndex = data.IndexOf("^", mIndex + 1)
        End While
    End Sub
End Module

Demo

非正则表达式

如果正则表达式太复杂而无法理解,那么这是一种非正则表达式方法

**Integer** cannot be converted to **Byte**

Demo

答案 1 :(得分:1)

我建议这个site进一步阅读正则表达式。您可以使用以下内容:

Dim input As String = "M123456789^M123^C123^M1234^"
For Each m As Match In Regex.Matches(input, "M[^^]*\^")
    Console.WriteLine(m.Value)
Next

<强>输出

M123456789^
M123^
M1234^

正则表达式首先匹配&#34; M&#34;然后使用否定字符类,该字符类匹配除^&#34;零或更多&#34;之外的任何字符。然后终于寻找并匹配结束的插入符号。

答案 2 :(得分:1)

您可能需要考虑非正则表达式方法。当你真正需要它时,正则表达式很好,但它只是一个只写的#34;编码风格,可以使未来的维护变得困难。

尝试使用这种LINQ方法:

hour to hour

我得到了理想的结果:

results