正则表达式中的问题,用于在字符串的开头和结尾设置字符,固定长度和节奏

时间:2019-01-19 05:40:15

标签: java regex regular-language

最初,我有一个要求我应该检查给定的字符串是否遵循以下两种模式。

  • "^(.{1,5})?$"-用于检查字符串长度是否最多5个字符
  • "[!-~]|([!-~][ -~]*[!-~])"-表示String不能以空格开头或结尾。

更早的时候,当字符串不匹配时,我们会给出两种不同的消息,所以我的处理如下:

    Pattern pattern1 = Pattern.compile("^(.{1,5})?$");
    Pattern pattern2 = Pattern.compile("[!-~]|([!-~][ -~]*[!-~])");
    Matcher matcher1=pattern1.matcher(" verify");
    Matcher matcher2 = pattern2.matcher("verify");
    System.out.println("Message1 - " + matcher1.matches());
    System.out.println("Message2 - " + matcher2.matches());

但是现在的要求是我们需要: -我们需要结合以上两种模式,但

-还包括该字符串可以包含以下字符$,#,@,而不是字母,数字

-并只给出一条消息。

我看了许多类似的问题: regex for no whitespace at the begining and at the end but allow in the middlehttps://regex101.com/制作一个正则表达式,如:

Pattern pattern3=Pattern.compile(
  "^[^\\\s][[-a-zA-Z0-9-()@#$]+(\\\s+[-a-zA-Z0-9-()@#$]+)][^\\\s]{1,50}$");

但是正则表达式无法正常工作。 如果我提供的字符串中未包含正则表达式中提到的字符(如'%'),则该字符串应该会失败,但会通过。

我试图找出上述正则表达式或任何可以满足需要的新正则表达式中的问题。

@edit更清楚: 有效输入:“ Hell @”

无效输入:“地狱”(@@开头为白色)

无效的输入:不需要“地狱%”圆锥形字符'%'

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

^(?!\s)[a-zA-Z\d$#@ ]{1,5}(?<!\s)$

RegEx Demo

RegEx详细信息:

  • ^:开始
  • (?!\s):前瞻性负,开始时不允许空格
  • [a-zA-Z\d$#@ ]{1,5}:允许这些字符的长度在1到5之间
  • (?<!\s):向后看是负数,结尾处不允许有空格
  • $:结束

答案 1 :(得分:0)

这是一种应该满足您的两个要求的模式:

^\S(?:.{0,3}\S)?$

这符合条件:

\S        an initial non whitespace character
(
    .{0,3}    zero to three of any character (whitespace or non whitespace)
    \S        a mandatory ending whitespace character
)?        the entire quantity optional

Demo