Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
C# 作为匹配的一部分返回常量值的正则表达式_C#_Regex - Fatal编程技术网

C# 作为匹配的一部分返回常量值的正则表达式

C# 作为匹配的一部分返回常量值的正则表达式,c#,regex,C#,Regex,我有一个正则表达式来匹配两种不同的数字格式:\=(?[0-9]+)\?\+(?[0-9]+)\ 这应该返回9876543作为其的值;123456789012345656?+12345678900123456789012345123=9876543?和;1234567890123456?+9876543? 我希望能够返回另一个值以及匹配的“值” 例如,如果第一个字符串匹配,我希望它返回: 价值: 9876543 格式: 长格式 如果在第二个字符串中匹配: 价值: 9876543 格式: 短格式

我有一个正则表达式来匹配两种不同的数字格式:\=(?[0-9]+)\?\+(?[0-9]+)\

这应该返回9876543作为其的值;123456789012345656?+12345678900123456789012345123=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++;
    }
}