[英]Regex doesn't match as expected
我正在尝试编写一个正则表达式以匹配以下文本:
f
, s
或t
f
, s
或t
这是我想出的正则表达式: (f|s|t)(\\d+(f|s|t))*
,但似乎不起作用。
输入: f20s30t
预期比赛:
实际比赛:
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: f
, s
或t
(\\d+[fst])*
-0次或更多次重复(捕获到组2中,每个值保存在组堆栈中):
\\d+
-1个以上数字 [fst]
f
, s
或t
$
-字符串结尾。 在正则表达式世界(f|s|t)
等于[fst]
但相比之下有一些缺点。 因此,使用后者(字符类)代替前者。 使用split
方法,您可以对此进行拆分:
(?<=[fts])(?=\d+[fts])
正则表达式上方的位置匹配[fts]
中的字符与[fts]
的字符后面的数字出现的[fts]
。 这(?<=...)
是正向后看的,而(?=...)
构成正向前看。
代码(请参见此处的演示):
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]
: f
, s
或t
|
: 要么 [0-9]+
:一位或多位数字 [fst]
: f
, s
或t
$
:字符串结尾 在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.