如果和/或施工不起作用

时间:2018-03-30 17:01:01

标签: c# regex

请参阅下面的代码,在上一个IF声明中,我尝试了“&&”的不同组合或“||”但是如果两个格式布尔值都设置为true,则只能在此示例中获得有效输入。我尝试编写IF语句的任何其他方式,验证总是返回错误,或验证规则停止应用。

<table class="table">
   <thead>
        <tr>
            <th>table head</th>
        </tr>
    </thead>
</table>

<br>

<table class="table">
    <thead>
        <tr>
            <th>table head</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>table body</td>
        </tr>
    </tbody>
</table>

<br>

<table class="table">
    <tbody>
        <tr>
            <td>table body</td>
        </tr>
    </tbody>
</table>

基于下面的答案和反馈,这里是完整的代码,它可以很好地工作,并且可以通过编写更多的Regex语句(我将来可能会添加EIN)轻松扩展,或者编写不同的字符串来检查不同的电话格式是否可以接受信用卡等。

private static readonly Regex regexSSNDashes = new Regex(@"^\d{3}[-]\d{2}[-]\d{4}$");
private static readonly Regex regexSSNNoDashes = new Regex(@"^\d{3}\d{2}\d{4}$");

public static string SSN(String propertyName, bool isRequired, bool allowDashFormat, bool allowNoDashFormat)
    {
        if ((String.IsNullOrWhiteSpace(propertyName)) 
            && (isRequired == true))
        {
            return "SSN required.";
        }

        if ((!String.IsNullOrEmpty(propertyName))
            && ((!regex.SSNDashes.IsMatch(propertyName)) && (allowDashFormat == true))
            && ((!regex.SSNNoDashes.IsMatch(propertyName)) && (allowNoDashFormat == true)))            
        {
            return "Invalid SSN.";
        }   

        return null;      
    }

3 个答案:

答案 0 :(得分:2)

虽然接受的答案在技术上是正确的,但让我们问哪一个更易于维护,这个:

if (!String.IsNullOrEmpty(propertyName) &&
    !(regex.SSNDashes.IsMatch(propertyName) && allowDashFormat) &&
    !(regex.SSNNoDashes.IsMatch(propertyName) && allowNoDashFormat))         
{
    return "Invalid SSN.";
}

或者这个:

//You've already checked for a null string, it doesn't need to be repeated here
if (allowDashFormat)
{
    if (!regex.SSNDashes.IsMatch(propertyName))
        return "Invalid SSN";
}
else
{
    if (!regex.SSNNoDashes.IsMatch(propertyName))
        return "Invalid SSN";
}

关键不在于为了缩短它们而使事情复杂化。编译器会为您处理。编写可维护/可读代码,而不是短代码。

答案 1 :(得分:1)

你的逻辑是关闭的。它应该是这样的:

if (String.IsNullOrWhiteSpace(propertyName) && isRequired)
{
    return "SSN required.";
}
else if (!String.IsNullOrEmpty(propertyName) &&
    !(allowDashFormat && regex.SSNDashes.IsMatch(propertyName)) &&
    !(allowNoDashFormat && regex.SSNNoDashes.IsMatch(propertyName))         
{
    return "Invalid SSN.";
}

简单地说,如果SSN不为空或,则输入两个正则表达式模式都会失败,具体取决于短划线模式,则SSN被视为无效。

我上面写的表达的核心是德摩根定律。它说NOT(p OR q) == NOT p AND NOT q

修改

我建议实际使用单个正则表达式模式来涵盖可接受的社会安全号码的两个版本:

Regex bothSSNRegex = new Regex(@"^(?:\d{3}-\d{2}-\d{4})|(?:\d{7})$");

答案 2 :(得分:0)

试试这个。你应该好。

在检查allowDashFormat之前检查布尔条件regExMatch可以提高性能。因为如果allowDashFormat为false,则无需检查regExMath。

public static string SSN(String propertyName, bool isRequired, bool allowDashFormat, bool allowNoDashFormat)

    {

 if ((String.IsNullOrWhiteSpace(propertyName))
            && (isRequired == true))
        {
            return "SSN required.";
        }
        if (!String.IsNullOrEmpty(propertyName)
            && (allowDashFormat && !regex.SSNDashes.IsMatch(propertyName)
            && (allowNoDashFormat && !regex.SSNNoDashes.IsMatch(propertyName))))
        {
            return "Invalid SSN.";
        }
        return null;

    }
}