需要帮助使用C#使用正则表达式查找字符串中的模式

时间:2015-08-21 23:19:40

标签: c# regex

我有以下格式的字符串..

"ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00|ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC11.00|ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00";

我想要做的是找到下一个以管道开头但后面没有的组 - 所以上面的字符串将指向3个部分,例如

ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00
ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00
ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00

我玩了下面的代码,但它似乎没有做任何事情,它没有给我下一个块的位置,其中管道char没有后跟一个破折号( - )

String pattern = @"^+|[A-Z][A-Z][A-Z]$";

在上面我的逻辑是

1:Start from the beginning
2:Find a pipe character which is not followed by a dash char
3:Return its position
4:Which I will eventually use to substring the blocks
5:And do this till the end of the string

请善意,因为我不知道正则表达式是如何工作的,我只是想尝试使用它。谢谢,语言是C#

2 个答案:

答案 0 :(得分:1)

您可以使用\|(?!-)模式为|

请注意,您需要转义(?!-)字符,因为它是用于交替的正则表达式中的元字符。 |为负面预测,在var pattern = @"\|(?!-)"; var results = Regex.Split(input, pattern); foreach (var match in results) { Console.WriteLine(match); } 字符后遇到短划线时会停止匹配。

{{1}}

答案 1 :(得分:0)

我的正则表达式逻辑是:

  • 分隔符是管道" [|]"
  • 我们将收集一系列不是我们分隔符的字符 "("不是我们的分隔符")"但至少有一个角色" +"
  • " [^ |]"不是我们的分隔符
  • " [|] [ - ]"也不是我们的分隔符

变量"模式"可以使用" *"而不是" +"如果空段可以接受。该模式以"?"因为我们的最后一个字符串段(在你的例子中)没有管道符。

using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace ConsoleTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = "ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00|ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC11.00|ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00";
            var pattern = "([^|]|[|][-])+[|]?";
            Match m;

            m = Regex.Match(input, pattern);
            while (m.Success) {
                Debug.WriteLine(String.Format("Match from {0} for {1} characters", m.Index, m.Length));
                Debug.WriteLine(input.Substring(m.Index, m.Length));
                m = m.NextMatch();
            }
        }
    }
}

输出是:

Match from 0 for 50 characters
ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00|
Match from 50 for 49 characters
ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC11.00|
Match from 99 for 49 characters
ABC 12.23-22-22-11|-ABC 33.20-ABC 44.00-ABC 11.00