【问题标题】:Validate that a string contain some exact words验证字符串是否包含一些确切的单词
【发布时间】:2012-05-01 16:28:27
【问题描述】:

我有一个类似这样的字符串

string myString = "Master Language=\"C#\" MasterPageFile=\"~/masterpages/Libraries.master\"";
  1. 我需要验证它是否包含确切的单词 Master 和 Language="C#"
  2. 我不能总是保证 Master 和 Language 会这样放置,因此 Contains("Master Language") 之类的东西不会这样做

我一直在玩 regex.IsMatch 一段时间没有任何结果,所以如果有人能帮助我,我将不胜感激!

【问题讨论】:

  • 为什么不IndexOf() >= 0Contains
  • Contains 将同时获得 Master 和 MasterPageFile 所以不不不!
  • @Trikks 仅在您搜索“Master”时才成立,但如果您搜索示例中出现的 Master Language="C#",它将与“MasterPage”不匹配。除非这两个词可以出现在字符串中的任何位置,而不是如图所示依次出现,否则Contains 就足够了。
  • 我不能总是说字符串总是以这种方式构造的。属性有时可能会发生变化!
  • @Trikks 那么你需要在你的问题中包含它。

标签: c# regex


【解决方案1】:

由于您需要以任意顺序查找单词的出现,您可以使用以下模式:

string pattern = @"^(?=.*\bMaster\b)(?=.*Language=""C#"").+$";

这使用正面环视来检查MasterLanguage="C#" 的存在。请注意单词边界元字符\b 的使用,它确保“Master”是完全匹配的。这样可以确保不会出现“MasterPage”中的部分匹配。

例子:

string[] inputs = 
{
    "Master Language=\"C#\" MasterPageFile=\"~/masterpages/Libraries.master\"", // true
    "Language=\"C#\" MasterPageFile=\"~/masterpages/Libraries.master\" Master", // true
    "Language=\"C#\" MasterPageFile=\"~/masterpages/Libraries.master\"" // false
};

string pattern = @"^(?=.*\bMaster\b)(?=.*Language=""C#"").+$";

foreach (var input in inputs)
{
    Console.WriteLine(Regex.IsMatch(input, pattern));
}

【讨论】:

  • 效果很好,我将采用稍微不同的方法,但这是尽可能接近的。感谢您了解使用 Regex 解决此类问题的价值!
【解决方案2】:

可以使用字符串类的 Contains() 方法。

【讨论】:

  • 嗯,不,不是因为我在寻找 Master 时单词 MasterPageFile 也可能在字符串中。如果其中任何一个在字符串中并且不好,该方法将始终返回 true。
【解决方案3】:
string strTestMe = Regex.Replace(myString, ".*(Master Language=\"C#\").*", "$2")
If strTestMe <> ""
  DO STUFF
End If

【讨论】:

    【解决方案4】:

    我意识到这可能不是您正在寻找的答案,但老实说,在这里使用正则表达式似乎有点矫枉过正。简单地使用 string.Contains 可能会获得更好的整体性能

    【讨论】:

    • Contains 将同时获得 Master 和 MasterPageFile 所以不不不!
    【解决方案5】:

    您可以使用 IndexOf 方法,LINK 找出字符串中是否存在模式。

    bool found = myString.IndexOf("Master Language=\"C#\"") != -1;
    

    【讨论】:

    • 可以解决问题,但我不能总是说字符串总是以这种方式构造的。属性有时可能会发生变化!
    【解决方案6】:

    这就是我所做的

    bool containMaster = Regex.IsMatch(myString, @"\bMaster\b");
    bool containLanguage = Regex.IsMatch(myString, "Language=\"C#\"");
    

    简单有效

    【讨论】:

    • ...并且比 Contain any way of the week 等字符串方法更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多