我正在尝试编写正则表达式以匹配以下文本:
f
,s
或t
f
,s
或t
这是我提出的正则表达式:(f|s|t)(\d+(f|s|t))*
,但它似乎无法正常工作。
输入:f20s30t
预期比赛:
实际匹配:
f
30t
t
为什么我的正则表达式表达式错误?
编辑:我使用this方法分割输入。
答案 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:
<强>详情
^
- 字符串的开头([fst])
- 捕获第1组:f
,s
或t
(\d+[fst])*
- 0次或更多次重复(捕获到组2中,每个值保存在组堆栈中):
\d+
- 1+位数[fst]
- f
,s
或t
$
- 字符串结束。答案 1 :(得分:1)
在正则表达式世界(f|s|t)
等于[fst]
,但相比之下有一些缺点。所以使用后者(一个字符类)代替前者。使用split
方法可以拆分:
(?<=[fts])(?=\d+[fts])
以上正则表达式匹配[fts]
中的字符符合[fts]
中字符后面的数字出现的位置。这个(?<=...)
是一个积极的后视,(?=...)
构建了一个积极的前瞻。
代码(见演示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]
: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