正则表达式查找包含多个空格的字符串,没有前导/尾随空格

时间:2018-02-11 23:38:34

标签: java regex

目前我有

    Pattern p = Pattern.compile("\s");
    boolean invalidChar = p.matcher(text).find();

我希望它只有在我有一个以上的空格时才返回true。 此外,字符串的开头或结尾不应有任何空格。

因此一些有效/无效的文本将是

12 34 56 = valid

ab-34 56 = valid

ab    34 = invalid

     12 34 53 = invalid

5 个答案:

答案 0 :(得分:3)

试试这个:

(^\s{1,}|\s{2,}|\s$)

决赛:

Pattern p = Pattern.compile("(^\s{1,}|\s{2,}|\s$)");

答案 1 :(得分:3)

没有正则表达式..

public class Answ {

    public static boolean isValid(String s) {
        return !s.contains("  "); //two white spaces
    }

    public static void main(String[] args) {
        String st1 = "12 34 56";

        System.out.println(isValid(st1));
    }
}

答案 2 :(得分:1)

由于字符串的开头和结尾不能有空格,并且里面不能有两个或多个连续的空格,你可以使用

boolean isValid = s.matches("\\S+(?:\\s\\S+)*"); 

此表达式将匹配以下内容:

  • ^(隐含在matches中默认锚定匹配,即整个字符串必须与正则表达式匹配) - 字符串的开头
  • \S+ - 除了空格之外的1个或多个字符
  • (?:\s\S+)* - 零个或多个序列:
    • \s - 一个空白
    • \S+ - 除了空格之外的1个或多个字符
  • $(隐含在matches中) - 字符串的结尾。

请参阅regex demo

答案 3 :(得分:1)

您可以使用此模式:

Pattern p = Pattern.compile("(?<!\\S)(?!\\S)");
Matcher m = p.matcher(text);

boolean invalidChar = m.find();

boolean isValid = !m.find(),如您所愿。

(?<!\\S)表示&#34;前面没有非空格&#34; (包括前面的空格或字符串的开头)和(?!\\S) &#34;后面没有非空格&#34; (包括后面的空格或字符串的结尾)。

这两个外观描述了所有可能的情况:

  • 连续的空格(匹配前两个空格之间的位置)
  • 开头或结尾的空格
  • 空字符串

答案 4 :(得分:0)

试试这个:

boolean invalidChar = text.matches("\\S(?!.*\\s\\s).*\\S");

说明:

\\S - 匹配以非空格字符开头

(?!.*\\s\\s) - 负向前瞻断言,以确保没有两个空白字符的实例彼此相邻

.* - 匹配任何字符的0或更多

\\S - 匹配以非空白字符结尾

注意:仅当正则表达式与整个matches("regex")字符串匹配时,text方法才返回true。