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

时间:2009-02-13 03:08:53

标签: c# regex

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

这应该返回9876543作为其; 1234567890123456?+ 1234567890123456789012345123 = 9876543的价值?
; 1234567890123456?+9876543? 我想要的是能够返回另一个值以及匹配的'Value'。

因此,例如,如果第一个字符串匹配,我希望它返回:

值: 9876543 格式: LongFormat


如果在第二个字符串中匹配:

值: 9876543 格式: ShortFormat


这可能吗?

3 个答案:

答案 0 :(得分:3)

另一个选项,它不是你想要的解决方案,但是使用两个单独的正则表达式来保存你,是使用命名组,如果你的实现支持它。

这是一些C#:

var regex = new Regex(@"\=(?<Long>[0-9]+)\?|\+(?<Short>[0-9]+)\?");
string test1 = ";1234567890123456?+1234567890123456789012345123=9876543?";
string test2 = ";1234567890123456?+9876543?";

var match = regex.Match(test1);
Console.WriteLine("Long: {0}", match.Groups["Long"]);     // 9876543
Console.WriteLine("Short: {0}", match.Groups["Short"]);   // blank
match = regex.Match(test2);
Console.WriteLine("Long: {0}", match.Groups["Long"]);     // blank
Console.WriteLine("Short: {0}", match.Groups["Short"]);   // 9876543

基本上只需修改你的正则表达式以包含名称,然后regex.Groups [GroupName]将具有值或不会。您甚至可以使用组的Success属性来了解匹配的匹配项(match.Groups [“Long”]。成功)。

更新: 您可以使用以下代码从匹配中获取组名:

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++;
    }
}

我忽略了第0组,因为这总是.NET中的整个匹配

答案 1 :(得分:2)

不,您无法匹配不存在的文字。匹配只能返回目标的子字符串。

您基本上希望匹配两种模式,并在每种情况下采取不同的操作。看看你是否可以在代码中将它们分开:

if match(\=(?[0-9]+)\?) then
    return 'Value: ' + match + 'Format: LongFormat'
else if match(\+(?[0-9]+)\?) then
    return 'Value: ' + match + 'Format: ShortFormat'

(请原谅这个狡猾的伪代码,但你明白了。)

答案 2 :(得分:1)

您无法匹配不存在的文字 - 但是,根据您使用的语言,您可以处理您匹配的内容,并根据内容有条件地添加文字。

使用正则表达式的一些实现,您可以指定一个“回调函数”,它允许您针对每个结果运行逻辑。

这是一个伪代码示例:

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;
}

在支持正则表达式回调的语言中,每次找到匹配项时都会执行formatValue函数,并使用函数的结果作为替换文本。

您尚未指定您正在使用哪种实施方式,因此您可能会或不可以这样做,但绝对值得一试。