我有以下格式的字符串..
"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#
答案 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