Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于验证字符串的正则表达式模式_Regex - Fatal编程技术网

Regex 用于验证字符串的正则表达式模式

Regex 用于验证字符串的正则表达式模式,regex,Regex,让我把我的问题简单一点,我想要的是我使用白名单正则表达式模式来避免xss和sql注入,因为字符串中允许的字符是[A-Za-z0-9,()[]{}\”\:./\uS],我想限制在来自客户机的任何未来请求中出现-,但它应该允许-或jjdfasd-dsfads-12321字符串 简而言之,下面的测试用例应该成功运行 import java.util.regex.Pattern; public class RegExTest { private static Pattern xssAttackPa

让我把我的问题简单一点,我想要的是我使用白名单正则表达式模式来避免xss和sql注入,因为字符串中允许的字符是[A-Za-z0-9,()[]{}\”\:./\uS],我想限制在来自客户机的任何未来请求中出现-,但它应该允许-或jjdfasd-dsfads-12321字符串

简而言之,下面的测试用例应该成功运行

import java.util.regex.Pattern;


public class RegExTest {

private static Pattern xssAttackPattern;

private static final String XSS_ATTACK_REGULAR_EXPRESSION1 = "-?[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*";


public static Pattern getXSSAttackPattern1() {
    xssAttackPattern = Pattern.compile(XSS_ATTACK_REGULAR_EXPRESSION1);
    return xssAttackPattern;
}

public static boolean hasXSSAttackOrSQLInjection1(String value) {

    if (getXSSAttackPattern1().matcher(value).matches()) {
        return true;
    }
    return false;
}



public static void main(String arg[]) {

    System.out.println(" :::::: Regular Expression ::::::");
    regexTest();

}

private static void regexTest() {

    String str1 = "-dsfdsfddsfd2112212s";
    String str2 = "--dsfdsfddsfd2112212s";
    String str3 = "-dsfdsfdd-sfd2112212s";
    String str4="http://rss.cnn.com/rss/edition_business.rss?id=121132511$@#$@$@#%242444+gfghgfhg";
    String str5="(.:[]{}";
    String str6="--";
    String str7="-";

    System.out.println("String::" + str1 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str1));
    System.out.println("String::" + str2 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str2));
    System.out.println("String::" + str3 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str3));
    System.out.println("String::" + str4 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str4));
    System.out.println("String::" + str5 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str5));
    System.out.println("String::" + str6 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str6));
    System.out.println("String::" + str7 + "::Result::"
            + hasXSSAttackOrSQLInjection1(str7));
}

}

您当前的正则表达式匹配

  • 由单个
    -
    字符组成的字符串,或
  • 由一系列字母、数字和一些特殊字符组成的字符串,或
  • 空字符串
如果要将其更改为仅在字符串开头允许零或一个破折号
-
,请从表达式中删除或字符
|
;如果要在字符串中的任何位置最多匹配一个破折号,请将表达式更改为

[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*-?[A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]*
编辑1:如果需要避免两个连续的破折号,可以将此表达式用于:


注意:清理字符串不是避免SQL注入攻击的最佳方法;使用参数化语句是。

“允许A-Z 0-9和A-Z多次出现,但(-)只在字符串中出现零或一次。“我不明白这一点,这句话自相矛盾。你提议的regexp中的反斜杠狂欢是怎么回事?”@Harshil-那么你希望你的regex匹配上述字符串还是丢弃它们?他们离A-Za-z0-9很远,只有一个破折号。。。谢谢你的快速回复,但它仍然不能满足我上面的测试用例classI just的要求,并且它产生了一个很好的答案序列:第一个是匹配的,第二个和第三个不是,因为它们都有两个破折号。第四个有无效字符(@、#、$、%),第五个没有非法字符或破折号,因此匹配;第六个是双破折号,第七个可以匹配。我想要的是我的第三个字符串应该匹配,因为没有两个连续的-@Harshil我不知道你在寻找连续破折号。请看一下我的编辑。您好,因为我对您给定的Regex模式非常大的字符串(约14965个字符)有问题,这是从一些文件中读取的。我有与此链接中相同的失败跟踪
([A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|(?<!-)-)*
[^A-Za-z0-9,\\(\\)\\[\\]\\{\\}\"\\:./_\\s]|--