从字符串中查找有效的文本

时间:2019-05-15 11:36:04

标签: c# regex

我们允许用户自由输入文本框,如下所示:

SomeText[Foo.Id]-[Bar.Value]  (valid)
Xyz[Foo.Id]_[Bar.Value]       (valid)
abc-[pqr]                     (invalid)

预定义值:

Foo.Id
Bar.Value

什么是最好的方法来确保:

  1. []中的文本应与一组预定义的值匹配
  2. 如果输入了任何无效文本,请识别该错误文本

我认为正则表达式将是正确的方法。

2 个答案:

答案 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\])*