正则难题。200分求方案。

马老虎 2013-10-17 05:32:32

//正则:\d+(?<name>[A-Z])+\d+
//匹配:123AC321

//注意分组 name 后面可重复1次以上

//匹配结果 分组name = C

//要求,应该让name分组 返回一个集合 [A,C]

//题目如此,请大神解答。(使用递归或平衡组都可)。

//大神有啥好的解决方法请留言。(大家不要扣字眼,比如说匹配 AC ,然后Split)

//分不多

...全文
1130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
马老虎 2013-10-18
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
没看懂题意,为什么要递归和平衡组。有嵌套关系?
唉。我对平衡组 递归不熟悉。以为能用他们解决呢
q107770540 2013-10-17
  • 打赏
  • 举报
回复
js里我试了,貌似比较复杂:
                var arr = [],
                        s = "123AC321",
                        re = /\d+([A-Z])+\d+/g,
                        item;

                while (item = re.exec(s))
                    arr.push(item[1]);

                alert(arr);  //C
                var arr = [],
                        s = "123AC321",
                        re = /\d+([A-Z]+)\d+/g,
                        item;

                while (item = re.exec(s))
                    arr.push(item[1]);

                alert(arr);  //AC
threenewbee 2013-10-17
  • 打赏
  • 举报
回复
没看懂题意,为什么要递归和平衡组。有嵌套关系?
q107770540 2013-10-17
  • 打赏
  • 举报
回复
你已经将\转义了啊,那\\ 肯定的是 \字符了 要么这样: Regex reg = new Regex(@"^([""'])[^\1]+?\1$"); 要么这样:  Regex reg = new Regex("^([\"'])[^\1]+?\1$"); PS: JS正则是不支持命名捕获组的,不过Captures要再试试
马老虎 2013-10-17
  • 打赏
  • 举报
回复
引用 5 楼 q107770540 的回复:
专家不在线。。。 后来我自己写代码测试了,从代码已经看出答案了啊:
void Main()
{
    Regex reg=new Regex(@"^([""'])[^\1]+?\1$");
    string[] test=
                {
                    "'a\"s\\1d'",
                    "'a\"\\s1d'",
                    "'a\"sd'",
                    "\"a'sd\""
                };
    foreach(string s in test)
        Console.WriteLine("{0}:\t{1}",s,reg.IsMatch(s));
         
    /*
    'a"s\1d':    True    如果此处是匹配\,1外的字符,那此处不应该是true
    'a"\s1d':    True
    'a"sd':    True
    "a'sd":    True
    */
}
我测试的是

// \加转义符
 Regex reg = new Regex(@"^([""'])[^\\1]+?\1$");
马老虎 2013-10-17
  • 打赏
  • 举报
回复
引用 2 楼 q107770540 的回复:
string str="123AC321";
Regex reg=new Regex(@"\d+(?<name>[A-Z])+\d+");
Match m =reg.Match(str);
string[] result=m.Groups["name"].Captures.Cast<Capture>().Select(c=>c.Value).ToArray();
哦原来是这个属性。 假如说js代码 能实现类似的功能么?
q107770540 2013-10-17
  • 打赏
  • 举报
回复
专家不在线。。。 后来我自己写代码测试了,从代码已经看出答案了啊:
void Main()
{
    Regex reg=new Regex(@"^([""'])[^\1]+?\1$");
    string[] test=
                {
                    "'a\"s\\1d'",
                    "'a\"\\s1d'",
                    "'a\"sd'",
                    "\"a'sd\""
                };
    foreach(string s in test)
        Console.WriteLine("{0}:\t{1}",s,reg.IsMatch(s));
         
    /*
    'a"s\1d':    True    如果此处是匹配\,1外的字符,那此处不应该是true
    'a"\s1d':    True
    'a"sd':    True
    "a'sd":    True
    */
}
马老虎 2013-10-17
  • 打赏
  • 举报
回复
引用 3 楼 q107770540 的回复:
不知道在你上个帖子中,我帖的关于解释[^\1]到底是匹配什么代码 你还有问题没有 就这个问题,我还特地请教了正则方面的专家
[^\1] 我测试的 字符 \ ,1 取反。 专家是咋答复的?
q107770540 2013-10-17
  • 打赏
  • 举报
回复
不知道在你上个帖子中,我帖的关于解释[^\1]到底是匹配什么代码 你还有问题没有 就这个问题,我还特地请教了正则方面的专家
q107770540 2013-10-17
  • 打赏
  • 举报
回复
string str="123AC321";
Regex reg=new Regex(@"\d+(?<name>[A-Z])+\d+");
Match m =reg.Match(str);
string[] result=m.Groups["name"].Captures.Cast<Capture>().Select(c=>c.Value).ToArray();
q107770540 2013-10-17
  • 打赏
  • 举报
回复
用组1的Captures获取即可啊

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧