我要验证的文本字符串包含我称之为“段”的内容。单个细分可能如下所示:
[A-Z,S,3]
到目前为止,我设法构建了这个正则表达式模式
(?:\[(?<segment>[^,\]\[}' ]+?,[S|D],\d{1})\])+?
它可以工作,但即使整个文本字符串包含无效文本,它也会返回匹配项。我想我需要在我的模式中的某处使用^
和$
,但我无法弄清楚如何!?
我希望我的模式能够产生以下结果:
[A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4]
确定(两段) [A-Z,S,3]aaaa[A-Za-z0-9åäöÅÄÖ,D,4]
不匹配 crap[A-Z,S,3][A-Za-z0-9åäöÅÄÖ,D,4]
不匹配 [A-Z,S,3][]
不匹配 [A-Z,S,3][klm,D,4][0-9,S,1]
确定(三段) 答案 0 :(得分:3)
使用^来锚定开始,使用$来锚定结尾。例如:^(abc)*$
,它匹配组的零次或多次重复(本例中为“abc”),并且必须从输入字符串的开头开始并在结束时结束。
^(?:[(?[^,][}' ]+?,[S|D],\d{1})])+$
- 使用不合格+?
并不重要,因为您要求它匹配到最后。但是,你的正则表达式有一些问题。
^(?:\[[^,]+,[SD],\d\])+$
- 看起来更像你想要的。
[^,]+,
将匹配任何序列的非逗号后跟一个逗号,实际上你应该添加]
对这个否定的角色类。[S|D]
是三个字符的字符类,因为|
并不代表此处的替换((S|D)
与{{1}相同虽然)。[SD]
是任何atom的默认值,您无需指定它。Pseudocode(在codepad.org运行):
{1}
这里的最大区别是表达式仅匹配完整的import re
def find_segments(input_string):
results = []
regex = re.compile(r"\[([^],]+),([SD]),(\d)\]")
start = 0
while True:
m = regex.match(input_string, start)
if not m: # no match
return None # whole string didn't match, do another action as appropriate
results.append(m.group(1, 2, 3))
start = m.end(0)
if start == len(input_string):
break
return results
print find_segments("[A-Z,S,3][klm,D,4][0-9,S,1]")
# output:
#[('A-Z', 'S', '3'), ('klm', 'D', '4'), ('0-9', 'S', '1')]
部分,但它会连续应用,因此它们必须在最后一个结束处(或在字符串末尾结束)再次开始。
答案 1 :(得分:0)
你想要这样的东西:
/^(\[[^],]+,[SD],\d\])+$/
以下是如何在C#中使用此正则表达式的示例:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string[] tests = {
"[A-Z,S,3][A-Za-z0-9,D,4]",
"[A-Z,S,3]aaaa[A-Za-z0-9,D,4]",
"crap[A-Z,S,3][A-Za-z0-9,D,4]",
"[A-Z,S,3][]",
"[A-Z,S,3][klm,D,4][0-9,S,1]"
};
string segmentRegex = @"\[([^],]+,[SD],\d)\]";
string lineRegex = "^(" + segmentRegex + ")+$";
foreach (string test in tests)
{
bool isMatch = Regex.Match(test, lineRegex).Success;
if (isMatch)
{
Console.WriteLine("Successful match: " + test);
foreach (Match match in Regex.Matches(test, segmentRegex))
{
Console.WriteLine(match.Groups[1]);
}
}
}
}
}
输出:
Successful match: [A-Z,S,3][A-Za-z0-9,D,4]
A-Z,S,3
A-Za-z0-9,D,4
Successful match: [A-Z,S,3][klm,D,4][0-9,S,1]
A-Z,S,3
klm,D,4
0-9,S,1