繁体   English   中英

正则表达式与预期不符

[英]Regex doesn't match as expected

我正在尝试编写一个正则表达式以匹配以下文本:

  • 字母中的一个 fst
  • 多次:
    • 至少一位数字
    • 字母中的一个 fst

这是我想出的正则表达式: (f|s|t)(\\d+(f|s|t))* ,但似乎不起作用。

输入: f20s30t

预期比赛:

  • F
  • 20多岁
  • 30吨

实际比赛:

  • f
  • 30t
  • t

为什么我的正则表达式表达错误?

编辑:我正在使用方法来拆分输入。

由于使用的是C#,因此可以将字符串与模式匹配 ,并访问每个重复捕获组的捕获集合:

var s = "f20s30t";
var m = Regex.Match(s, @"^([fst])(\d+[fst])*$");
if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);
    foreach (var g in m.Groups[2].Captures.Cast<Capture>().Select(t => t.Value))
        Console.WriteLine(g);
}

这种方法的优点是它也可以验证字符串,并且在这里您不会得到像TEXT random f20s30t here....这样的字符串的结果。

参见C#演示 ,输出

f
20s
30t

这是正则表达式演示

在此处输入图片说明

细节

  • ^ -字符串的开头
  • ([fst]) -捕获组1: fst
  • (\\d+[fst])* -0次或更多次重复(捕获到组2中,每个值保存在组堆栈中):
    • \\d+ -1个以上数字
    • [fst] fst
  • $ -字符串结尾。

在正则表达式世界(f|s|t)等于[fst]但相比之下有一些缺点。 因此,使用后者(字符类)代替前者。 使用split方法,您可以对此进行拆分:

(?<=[fts])(?=\d+[fts])

正则表达式上方的位置匹配[fts]中的字符与[fts]的字符后面的数字出现的[fts] (?<=...)是正向后看的,而(?=...)构成正向前看。

RegEx现场演示

代码(请参见此处的演示):

string input = "f20s30t";
string pattern = @"(?<=[fts])(?=\d+[fts])";

string[] substrings = Regex.Split(input, pattern);
foreach (string match in substrings)
{
    Console.WriteLine("{0}", match);
}

输出:

f
20s
30t

按照您的示例代码:

^([fst]|[0-9]+[fst])$
  • ^ :字符串的开头
  • [fst]fst
  • | : 要么
  • [0-9]+ :一位或多位数字
  • [fst]fst
  • $ :字符串结尾

在C#中:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string input = "f20s30t";
        string pattern = "([fst]|[0-9]+[fst])";
        string[] substrings = Regex.Split(input, pattern);
        foreach (string match in substrings)
        {
            Console.WriteLine("'{0}'", match);
        }
    }
}

//
//f
//
//20s
//
//30t

.NET小提琴

正则表达式101

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM