Home > Mobile >  Regex- Allow * in the beginning and in the end of a string and allow only *
Regex- Allow * in the beginning and in the end of a string and allow only *

Time:09-13

I need to write a regex that validates the input for a city. Except for characters only spaces are allowed and * acts as a wildcard character, so it can be either in the end or in the beginning of the string. * character should be allowed to be the only input as well.

Accepted strings:

  • *city
  • *cit *
  • '*' (only asterisk)
  • *city one

Not accepted strings:

  • **
  • *!@
  • %^&*

I have written this, but it doesn't allow only '*" as input. Any ideas? '^.*[A-Za-zÀ-ÖØ-öø-ž ]{1,34}.*$'

CodePudding user response:

You can use

^(?:\*|\*?\p{L} (?:\h \p{L}*)* \*?)$

See the regex demo.

Details:

  • ^ - start of string
  • (?:\*|\*?\p{L} (?:\h \p{L}*)* \*?) - either of the two patterns:
    • \* - an asterisk
    • | - or
    • \*? - an optional asterisk
    • \p{L} - one or more letters
    • (?:\h \p{L}*)* - one or more repetitions of one or more horizontal whitespaces followed with zero or more letters
    • \*? - an optional asterisk
  • $ - end of string.

In Java:

bool matched = text.matches("\\*|\\*?\\p{L} (?:\\h \\p{L}*)* \\*?");

CodePudding user response:

Here is a regex that might be shorter and efficient:

^(?:\*?[\p{L}\h] \*?|\*)$

RegEx Demo

RegEx Breakup:

  • ^: Start
  • (?:: Start non-capture group
    • \*?: Match an optional *
    • [\p{L}\h] : Match 1 of any unicode letter or horizontal whitespace
    • \*?: Match an optional *
    • |: OR
    • \*: Match a single *
  • ): End non-capture group
  • $: End

Java Code:

final String regex = "^(?:\\*?[\\p{L}\\h] \\*?|\\*)$";
String s = "* cit *";
System.out.println( s.matches(regex) );

CodePudding user response:

Welcome to StackOverflow!

Escape the asterisk with a backslash so that it isn't interpreted as a greedy repetition quantifier: \*.

Use beginning (^) and end ($) anchors to ensure that your asterisk can only occur at the start or end of the string.

Lastly, use a negative lookahead ((?!...)) to ensure that the match can't only be two asterisks.

Putting it all together, you get:

(?!^\*\*$)^\*?[\p{L} ]*\*?$

  • Related