当前位置:  开发笔记 > 编程语言 > 正文

每隔一次匹配

如何解决《每隔一次匹配》经验,为你挑选了3个好方法。

有没有办法指定正则表达式来匹配字符串中每个第二次出现的模式?

例子

寻找一个对字符串abcdabcd应该找到在5位出现一次

搜索ab 反对字符串abcdabcd应该在第5位找到一个匹配项

搜索dab 反对字符串abcdabcd应该找不到任何事件

搜索一个反对字符串aaaa应该在第2和第4位找到两个匹配项

Alex Barrett.. 61

使用分组.

foo.*?(foo)


Il-Bhima.. 9

假设你想要的模式是abc + d.您希望在字符串中匹配此模式的第二个匹配项.

您将构建以下正则表达式:

abc+d.*?(abc+d)

这将匹配形式的字符串: ....既然我们正在使用不情愿的限定符*?我们很安全,两者之间不可能有另一场比赛.使用几乎所有正则表达式实现提供的匹配器组,然后将在括号内的组中检索您想要的字符串.



1> Alex Barrett..:

使用分组.

foo.*?(foo)



2> Il-Bhima..:

假设你想要的模式是abc + d.您希望在字符串中匹配此模式的第二个匹配项.

您将构建以下正则表达式:

abc+d.*?(abc+d)

这将匹配形式的字符串: ....既然我们正在使用不情愿的限定符*?我们很安全,两者之间不可能有另一场比赛.使用几乎所有正则表达式实现提供的匹配器组,然后将在括号内的组中检索您想要的字符串.



3> Waleed Eissa..:

如果您正在使用C#,您可以立即获得所有匹配,即.使用Regex.Matches()返回MatchCollection(检查项目的索引,索引%2!= 0).

如果你想找到替换它的出现,请使用Regex.Replace()中一个使用MatchEvaluator的重载,例如Regex.Replace(String,String,MatchEvaluator,这里是代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "abcdabcd";

            // Replace *second* a with m

            string replacedString = Regex.Replace(
                input,
                "a",
                new SecondOccuranceFinder("m").MatchEvaluator);

            Console.WriteLine(replacedString);
            Console.Read();

        }

        class SecondOccuranceFinder
        {
            public SecondOccuranceFinder(string replaceWith)
            {
                _replaceWith = replaceWith;
                _matchEvaluator = new MatchEvaluator(IsSecondOccurance);
            }

            private string _replaceWith;

            private MatchEvaluator _matchEvaluator;
            public MatchEvaluator MatchEvaluator
            {
                get
                {
                    return _matchEvaluator;
                }
            }

            private int _matchIndex;
            public string IsSecondOccurance(Match m)
            {
                _matchIndex++;
                if (_matchIndex % 2 == 0)
                    return _replaceWith;
                else
                    return m.Value;
            }
        }
    }
}

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有