C# 作为匹配的一部分返回常量值的正则表达式
我有一个正则表达式来匹配两种不同的数字格式:\=(?[0-9]+)\?\+(?[0-9]+)\ 这应该返回9876543作为其的值;123456789012345656?+12345678900123456789012345123=9876543?C# 作为匹配的一部分返回常量值的正则表达式,c#,regex,C#,Regex,我有一个正则表达式来匹配两种不同的数字格式:\=(?[0-9]+)\?\+(?[0-9]+)\ 这应该返回9876543作为其的值;123456789012345656?+12345678900123456789012345123=9876543?和;1234567890123456?+9876543? 我希望能够返回另一个值以及匹配的“值” 例如,如果第一个字符串匹配,我希望它返回: 价值: 9876543 格式: 长格式 如果在第二个字符串中匹配: 价值: 9876543 格式: 短格式
和;1234567890123456?+9876543? 我希望能够返回另一个值以及匹配的“值” 例如,如果第一个字符串匹配,我希望它返回: 价值: 9876543 格式: 长格式
如果在第二个字符串中匹配: 价值: 9876543 格式: 短格式
这可能吗?不,您无法匹配不存在的文本。匹配只能返回目标的子字符串 您基本上希望匹配两种模式,并在每种情况下采取不同的操作。查看是否可以在代码中分隔它们:
if match(\=(?[0-9]+)\?) then
return 'Value: ' + match + 'Format: LongFormat'
else if match(\+(?[0-9]+)\?) then
return 'Value: ' + match + 'Format: ShortFormat'
(请原谅那些狡猾的伪代码,但你明白了。)你不能匹配那些不存在的文本-但是,根据你使用的语言,你可以处理匹配的内容,并根据存在的内容有条件地添加文本 对于某些regex实现,您可以指定一个“回调函数”,它允许您针对每个结果运行逻辑 下面是一个伪代码示例:
Input.replaceAll( /[+=][0-9]+(?=\?)/ , formatValue );
formatValue : function(match,groups)
{
switch( left(match,1) )
{
case '+' : Format = 'Short'; break;
case '=' : Format = 'Long'; break;
default : Format = 'Unknown'; break;
}
Value : match.replace('[+=]');
return 'Value: '+Value+' Format: ' + Format;
}
在一种支持regex回调的语言中,这将在每次找到匹配项时执行formatValue函数,并将函数的结果用作替换文本
您尚未指定要使用的实现,因此这对您来说可能是可能的,也可能是不可能的,但绝对值得检查。另一个选项,它不是您想要的解决方案,但可以使用两个单独的正则表达式,如果您的实现支持,则使用命名组 这里有一些C#:
var regex=newregex(@“\=(?[0-9]+)\?\?\+(?[0-9]+)\?”;
字符串test1=“;1234567890123456?+12345678900123456789012345123=9876543?”;
字符串test2=“;1234567890123456?+9876543?”;
var match=regex.match(test1);
Console.WriteLine(“Long:{0}”,match.Groups[“Long”]);//9876543
Console.WriteLine(“Short:{0}”,match.Groups[“Short”]);//空白的
match=regex.match(test2);
Console.WriteLine(“Long:{0}”,match.Groups[“Long”]);//空白的
Console.WriteLine(“Short:{0}”,match.Groups[“Short”]);//9876543
基本上只需修改regex以包含名称,然后regex.Groups[GroupName]将有一个值或不会有值。您甚至可以使用组的Success属性来了解匹配的组(match.Groups[“Long”].Success)
更新:
您可以使用以下代码从匹配中获取组名:
static void Main(string[] args)
{
var regex = new Regex(@"\=(?<Long>[0-9]+)\?|\+(?<Short>[0-9]+)\?");
string test1 = ";1234567890123456?+1234567890123456789012345123=9876543?";
string test2 = ";1234567890123456?+9876543?";
ShowGroupMatches(regex, test1);
ShowGroupMatches(regex, test2);
Console.ReadLine();
}
private static void ShowGroupMatches(Regex regex, string testCase)
{
int i = 0;
foreach (Group grp in regex.Match(testCase).Groups)
{
if (grp.Success && i != 0)
{
Console.WriteLine(regex.GroupNameFromNumber(i) + " : " + grp.Value);
}
i++;
}
}
static void Main(字符串[]args)
{
var regex=newregex(@“\=(?[0-9]+)\?\?\+(?[0-9]+)\?”;
字符串test1=“;1234567890123456?+12345678900123456789012345123=9876543?”;
字符串test2=“;1234567890123456?+9876543?”;
ShowGroupMatches(regex,test1);
ShowGroupMatches(regex,test2);
Console.ReadLine();
}
私有静态void ShowGroupMatches(正则表达式正则表达式,字符串测试用例)
{
int i=0;
foreach(regex.Match(testCase.Groups)中的grp组)
{
如果(grp.Success&&i!=0)
{
Console.WriteLine(regex.GroupNameFromNumber(i)+“:”+grp.Value);
}
i++;
}
}
我忽略了第0组,因为这始终是.NET中的全部匹配项谢谢你的回答,我很确定我在这一组中运气不好。这些字符串与刷卡器不同,但不同格式的刷卡可以将值与数据库中的不同字段相匹配。因此,组名应该是一个字段名(即StudentID或CustomField),以便知道要匹配哪个字段。看起来我需要单独设置。
static void Main(string[] args)
{
var regex = new Regex(@"\=(?<Long>[0-9]+)\?|\+(?<Short>[0-9]+)\?");
string test1 = ";1234567890123456?+1234567890123456789012345123=9876543?";
string test2 = ";1234567890123456?+9876543?";
ShowGroupMatches(regex, test1);
ShowGroupMatches(regex, test2);
Console.ReadLine();
}
private static void ShowGroupMatches(Regex regex, string testCase)
{
int i = 0;
foreach (Group grp in regex.Match(testCase).Groups)
{
if (grp.Success && i != 0)
{
Console.WriteLine(regex.GroupNameFromNumber(i) + " : " + grp.Value);
}
i++;
}
}