tooFastForSatan
tooFastForSatan

Reputation: 71

Regex NotBlank and doesnt contains <

I try to create a regex for a String which is NotBlank and cannot contain "<". My question is what Im doing wrong thank you.

"(\\A(?!\\s*\\Z))|([^<]+)"

Edit Maybe this way how to combine this regex

^[^<]+$

with this regex

\\A(?!\\s*\\Z).+

Upvotes: 2

Views: 98

Answers (2)

jordiburgos
jordiburgos

Reputation: 6302

You can try to use this regex:

[^<\s]+

Any char that is not "<", for 1 or more times.

Here is the example to test it: https://regex101.com/r/9ptt15/2

However, you can try to solve it without a regular expression:

boolean isValid = s != null && !s.isEmpty() && s.indexOf(" ") == -1 && s.indexOf("<") == -1;

Upvotes: 1

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626738

With regex, you can use

\A(?!\s+\z)[^<]+\z
(?U)\A(?!\s+\z)[^<]+\z

The (?U) is only necessary when you expect any Unicode chars in the input.

In Java, when used with matches, the anchors on both ends are implicit:

text.matches("(?U)(?!\\s+\\z)[^<]+")

The regex in matches is executed once and requires the full string match. Here, it matches

  • \A - (implicit in matches) - start of string
  • (?U) - Pattern.UNICODE_CHARACTER_CLASS option enabled so that \s could match any Unicode whitespaces
  • (?!\\s+\\z) - until the very end of string, there should be no one or more whitespaces
  • [^<]+ - one or more chars other than <
  • \z - (implicit in matches) - end of string.

See the Java test:

String texts[]  = {"Abc <<", "     ", "", "abc 123"};
Pattern p = Pattern.compile("(?U)(?!\\s+\\z)[^<]+");
for(String text : texts)
{
    Matcher m = p.matcher(text);
    System.out.println("'" + text + "' => " + m.matches());
}

Output:

'Abc <<' => false
'     ' => false
'' => false
'abc 123' => true

See an online regex test (modified to fit the single multiline string demo environment so as not to cross over line boundaries.)

Upvotes: 2

Related Questions