正则表达式没有像预期的那样匹配

时间:2018-05-17 15:18:26

标签: c# regex

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

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

这是我提出的正则表达式:(f|s|t)(\d+(f|s|t))*,但它似乎无法正常工作。

输入:f20s30t

预期比赛:

  • ˚F
  • 20秒
  • 30吨

实际匹配:

  • f
  • 30t
  • t

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

编辑:我使用this方法分割输入。

3 个答案:

答案 0 :(得分:1)

由于您使用的是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# demo,输出

f
20s
30t

以下是regex demo

enter image description here

<强>详情

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

答案 1 :(得分:1)

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

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

以上正则表达式匹配[fts]中的字符符合[fts]中字符后面的数字出现的位置。这个(?<=...)是一个积极的后视,(?=...)构建了一个积极的前瞻。

RegEx live demo

代码(见演示here):

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

答案 2 :(得分:1)

按照示例代码进行操作:

^([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 Fiddle

Regex101