【问题标题】:C# Check if Regex is a match, returns True instead of FalseC# 检查正则表达式是否匹配,返回 True 而不是 False
【发布时间】:2018-03-31 11:32:50
【问题描述】:

我不熟悉正则表达式,所以希望有人可以帮助我。我正在使用正则表达式,如果该特定正则表达式匹配,我将进一步检查代码。

我使用并想要检查的正则表达式:

  • Regex InitialGForKj = new Regex("[Y[\s\S]|E[BILPRSY]|I[BELN]]", RegexOptions.Compiled);。

现在我检查它是否匹配的代码如下:

else if (i == 0 && InitialGForKj.IsMatch(upperLetters.Substring(1, 3)))
        {
            dmetaphoneKeyResultPrimary.Append("K");
            dmetaphoneKeyResultSecondary.Append("J");
            i += 2;
        }
  • i 是当前字符(在本例中为“G”)。
  • upperLetters = 要检查的单词(在本例中:Garçon)。
  • dmetaphoneKeyResultPrimary 和 dmetaphoneKeyResultSecondary 是字母“G”的替代品(两者都是 Stringbuilders)。

我还检查了Console.WriteLine() 它的值是什么子字符串(返回“arç”)。 那么,现在的问题是,为什么代码将其视为true 而不是False?我想一定是False。

还是我做错了?

【问题讨论】:

  • [Y[\s\S]|E[BILPRSY]|I[BELN]] 看起来很奇怪:您似乎试图在字符类中使用交替构造,这是不可能的。能否进一步解释您要匹配的内容、检查输入的一些示例、结果以及出错时的预期?

标签: c# .net regex substring


【解决方案1】:

你必须写成

var InitialGForKj = new Regex("Y.|E[BILPRSY]|I[BELN]", RegexOptions.Compiled | RegexOptions.Singleline);

请参阅regex demo。请注意,. 匹配任何字符,包括换行符,因为 RegexOptions.Singleline 选项被传递给 Regex 构造函数。

当前的[Y[\s\S]|E[BILPRSY]|I[BELN]] 模式匹配 3 个备选方案:

  • [Y[\s\S] - Y、[、空格或非空格(匹配任何字符!)
  • | - 或
  • E[BILPRSY] - E 然后是来自班级的一封信
  • | - 或
  • I[BELN]] - I 后跟 B、E、L、N,然后是 ]。

如您所见,您通过用[ 和] 包围整个模式来破坏它。

【讨论】:

  • @RaymonJansen 我现在对.Substring(1, 3) 有点困惑:正则表达式必须匹配 3 个字符,对吧?如果您使用带有锚的版本,它将只匹配一个 2 字符的字符串。我应该删除带有锚的版本吗?你用的是@"Y[\s\S]|E[BILPRSY]|I[BELN]",对吧?
  • 好吧,我试图翻译这个:/* -ges-, -gep-, -gel- at beginning. */ if ( index === 0 && INITIAL_G_FOR_KJ.test(value.slice(1, 3))) { primary += 'K'; secondary += 'J'; index += 2; }
  • @RaymonJansen 好的,知道了:C# 中的String.Substring 接受长度作为第二个参数,而不是结束位置,如arr.slice(begin, end),所以你很可能需要使用upperLetters.Substring(1, 2)并使用带有锚的版本。尽管这两种模式都适用于这种情况。如果您稍后需要扩展模式以包含更长的替代方案,请确保更长的替代方案首先出现在未锚定的模式中。
  • 嗯,它现在可以工作了,我还不是很擅长编程,我不得不将很多代码从Java 翻译成C#,我现在正在使用:Regex InitialGForKj = new Regex("Y[\\s\\S]|E[BILPRSY]|I[BELN]", RegexOptions.Compiled); .正在尝试制作 DoubleMetaphone,所以我认为它以后不会改变。
  • @RaymonJansen 最好使用内置功能让. 匹配任何字符:var InitialGForKj = new Regex("Y.|E[BILPRSY]|I[BELN]", RegexOptions.Compiled | RegexOptions.Singleline);,我用最终模式更新了答案。
【解决方案2】:

首先,这是你现在的表达方式:

如您所见,外部 [ ] 将被识别为字符。所以放下它们!

因为 \s\S 被识别为空白或非空白,所以几乎所有内容,Garcon 都是有效匹配。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多