我们允许用户自由输入文本框,如下所示:
SomeText[Foo.Id]-[Bar.Value] (valid)
Xyz[Foo.Id]_[Bar.Value] (valid)
abc-[pqr] (invalid)
预定义值:
Foo.Id
Bar.Value
什么是最好的方法来确保:
我认为正则表达式将是正确的方法。
答案 0 :(得分:1)
一种灵活的方法是从[]
中提取文本,并根据您选择的白名单进行验证:
var validWords = new HashSet<string> {"[Foo.Id]", "[Bar.Value]"};
foreach (Match match in Regex.Matches("SomeText[Foo.Id]-[Bar.Value]-[Big.Mac]", @"(\[.*?\])")) {
foreach (Capture capture in match.Captures) {
if (!validWords.Contains(capture.Value)) {
Console.WriteLine($"{capture.Value} is not valid (Position {capture.Index})");
}
}
}
答案 1 :(得分:0)
准备一个包含所有可能值的字符串。字符串应如下所示:
(?:possible_value1|possible_value2|...|possible_valueN)
然后在正则表达式中使用它:
\w+\[REGEX_FOR_POSSIBLE_VALUES\][_-]\[REGEX_FOR_POSSIBLE_VALUES\]
例如,考虑唯一可能的值是:
Foo.Id
Bar.Value
那么最终的正则表达式将是:
\w+\[(?:Foo.Id|Bar.Value)\][_-]\[(?:Foo.Id|Bar.Value)\]
这是在考虑您始终需要两个括号组。
如果只能使用一个括号组,请使用:
\w+\[REGEX_FOR_POSSIBLE_VALUES\](?:[_-]\[REGEX_FOR_POSSIBLE_VALUES\])?
如果可以存在多个括号组,请使用:
\w+\[REGEX_FOR_POSSIBLE_VALUES\](?:[_-]\[REGEX_FOR_POSSIBLE_VALUES\])*