gpt4 book ai didi

c# - 多个正则表达式检查相同的字符串,没有重叠的结果,同时忽略单词

转载 作者:行者123 更新时间:2023-11-30 21:41:20 24 4
gpt4 key购买 nike

我有一个字符串,我想在其中检查是否存在 2 种不同类型的项目。这两种类型并不相互排斥,所以我也想避免重叠。它们也可以以任何顺序出现。字符串中还有一些词应该被忽略,即使它们符合正则表达式模式。

  1. 必须有一个只有字母的项目,一对多字符:[a-zA-Z]+
  2. 另一项需要是字母数字,也是一对多字符:[a-zA-Z0-9]+
  3. 字母数字项不能同时满足纯字母项的条件,反之亦然。
  4. 应忽略排除列表中的项目。

我尝试关注 Regex: I want this AND that AND that... in any order 后,但我仍然无法弄清楚如何排除我需要的单词,而且我无法弄清楚如何利用该答案,以便一个单词不能同时满足字母数字和仅 alpha标准。

这就是我目前正在做的,而且看起来还行,只是不是很简洁。如果可能的话,我想了解如何将其扩展到单个正则表达式检查。除了不是 super 简洁之外,我觉得正则表达式在我最终需要添加更多条件的情况下会更安全。

bool bHasAlpha = false;
bool bHasAlphaNum = false;
string Test = "123 ABC SomeWord A12"; //The string to check against.
string[] RemoveWords { "ABC", "DEF" }; //I don't want these matches to count, if found.

//Split my string into "tokens" and check each individually, ignoring the RemoveWords.
string[] TestTokens = Test.Split(' ')
.Select(s => s)
.Where(w => !RemoveWords.Contains(w, StringComparer.OrdinalIgnoreCase))
.ToArray();

foreach (string s in TestTokens)
{
//Is this item alpha-only? (Checking this before alphanumeric)
if (!bHasAlpha && Regex.IsMatch(s, @"^[a-zA-Z]+$"))
bHasAlpha = true;
//Is this item alphanumeric?
else if (!bHasAlphaNum && Regex.IsMatch(s, @"^[a-zA-Z0-9]+$"))
bHasAlphaNum = true;
}

if (bHasAlpha && bHasAlphaNum)
Console.WriteLine("String Passes!");

在上面的测试代码中,字符串会通过,因为“123”被字母数字检查捕获,而“SomeWord”被仅字母检查捕获。 “ABC”不是因为我故意忽略它。

应该失败的字符串示例:

  • "123 abc 456"(abc 被忽略,没有有效的 alpha-only 项目)
  • "X"(X 可以满足字母或字母数字,但不能同时满足两者)
  • “ABC DEF 123 456”(ABC 和 DEF 忽略,没有有效的 alpha-only 项目)

以下应该通过:

  • "ABCDEF 123"(ABCDEF 作为一个整体与单独的 ABC 和 DEF 不同)
  • “X X”(2 个“单词”,都不在排除列表中。一个满足字母数字标准,仅限字母。)
  • “ABC XYZ ABC DEF A1B2 ABC”(XYZ 是字母,A1B2 是字母数字)
  • 123 XYZ(2 项的顺序无关紧要。Alpha-only 可以是第二项)

最佳答案

恐怕如果可能的话,一个正则表达式来完成所有这些操作会过于复杂。但是,您可以分两步使用正则表达式来简化代码:

  1. 使用此正则表达式删除要忽略的所有单词:

    \b(?:ABC|DEF)\b
  2. 检查剩余的字符串是否匹配“字母和字母数字”条件(为清楚起见,下面使用伪代码):

    ALPHA.*ALNUM|ALNUM.*ALPHA

在 C# 中:

var removeRegex = new Regex(@"\b(?:" + string.Join("|", RemoveWords) + @")\b", RegexOptions.IgnoreCase);
var alpha = @"\b[a-z]+\b";
var alnum = @"\b[a-z0-9]+\b";
var matchRegex = new Regex(string.Format(@"{0}.*{1}|{1}.*{0}", alpha, alnum), RegexOptions.IgnoreCase);
foreach (var s in testStrings)
{
var ok = matchRegex.Match(removeRegex.Replace(s, "")).Success;
Console.WriteLine("{0}:\t{1}", ok ? "OK" : "Failed", s);
}

演示:https://dotnetfiddle.net/Ms3uKV

关于c# - 多个正则表达式检查相同的字符串,没有重叠的结果,同时忽略单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43474779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com