我有一个正则表达式来匹配2种不同的数字格式: \ =(?[0-9] +)\?| \ +(?[0-9] +)\? < / p>
这应该返回9876543作为其; 1234567890123456?+ 1234567890123456789012345123 = 9876543的价值?
和; 1234567890123456?+9876543?
我想要的是能够返回另一个值以及匹配的'Value'。
因此,例如,如果第一个字符串匹配,我希望它返回:
值: 9876543 格式: LongFormat
如果在第二个字符串中匹配:
值: 9876543 格式: ShortFormat
这可能吗?
答案 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函数,并使用函数的结果作为替换文本。
您尚未指定您正在使用哪种实施方式,因此您可能会或不可以这样做,但绝对值得一试。