Регулярное выражение для ОДНОГО или большего количества букв/цифр и ZERO-or-more

Я хочу разрешить 0 или более пробелов в моей строке и один или несколько A-Z или a-z или 0-9 в моей строке.

Регулярное выражение, позволяющее использовать пробел в Java

предлагает [0-9A-Za-z ]+.

Я сомневаюсь, что это регулярное выражение соответствует шаблонам с нулевым или большим количеством пробелов.

Что делать, чтобы разрешить 0 или более пробелов в любом месте строки и один или несколько символов в любом месте строки.

Будет ли это работать? ([0-9A-Za-z]+)([ ]*)

Ответы

Ответ 1

Я считаю, что вы можете сделать что-то вроде этого:

([ ]*+[0-9A-Za-z]++[ ]*+)+

Это 0 или более пробелов, за которыми следует не менее 1 алфавита char, за которым следует 0 или более пробелов

^^, что все это хотя бы один раз.

Использование идеи Pshemo для притяжательных кванторов для ускорения регулярного выражения.

Ответ 2

Вы также можете попробовать следующее:

  ^[0-9A-Za-z ]*[0-9A-Za-z]+[ ]*$

Ответ 3

Самый простой ответ

* означает zero or more, эквивалентный {0,}

+ означает one or more, эквивалентный {1,}

посмотрим на это

[A-Z]+ означает at least one Capital Letter, может быть записано как [A-Z]{1,}

[[email protected]#$%&]. означает, что эти специальные символы zero or more times могут быть записаны как [[email protected]#$%&]{0,}

извините, но

the purpose этого answer будет as Simple as possible

Ответ 4

Используйте lookahead:

^(?=.*\s*)(?=.*[a-zA-Z0-9]+)[a-zA-Z0-9 ]+$

Ответ 5

Прежде чем смотреть на другие ответы, я придумал это в двух регулярных выражениях:

boolean ok = (myString.matches("^[A-Za-z0-9 ]+$")  &&  !myString.matches("^ *$"));

Это соответствует одному или нескольким буквам/цифрам и нулевым или большим пробелам, но не только пробелам (или ничего).

Это можно было бы сделать эффективным, предварительно создав отдельный объект-метку для каждого регулярного выражения:

   import  java.util.regex.Matcher;
   import  java.util.regex.Pattern;
public class OnePlusLetterDigitZeroPlusSpace  {
   //"": Unused search string, to reuse the matcher object
   private static final Matcher mtchr1PlusLetterDigitSpc = Pattern.compile("^[a-zA-z0-9 ]+$").matcher("");
   private static final Matcher mtchr0PlusSpc = Pattern.compile("^ *$").matcher("");
   public static final void main(String[] ignored)  {
      test("");
      test(" ");
      test("a");
      test("hello ");
      test(" hello ");
      test("hello there");
   }
   private static final void test(String to_search)  {
      System.out.print("\"" + to_search + "\": ");
      if(mtchr1PlusLetterDigitSpc.reset(to_search).matches()  &&  !mtchr0PlusSpc.reset(to_search).matches())  {
         System.out.println("good");
      }  else  {
         System.out.println("BAD");
      }
   }
}

Вывод:

[C:\java_code\]java OnePlusLetterDigitZeroPlusSpace
"": BAD
" ": BAD
"a": good
"hello ": good
" hello ": good
"hello there": good

Интересный регулярный вопрос дня.

Ответ 6

Вы запрашиваете, чтобы строка (s) удовлетворяла этому условию (обратите внимание: пусть c∈s означает c∈{x|x is a character in s}. Кроме того, [] представляют классы символов regex):

(∀c∈s (c∈[0-9A-Za-z ])) ∧ (∃c∈s ∋ c∈[0-9A-Za-z])

Рассмотрим отрицание:

¬((∀c∈s c∈[0-9A-Za-z ]) ∧ (∃c∈s ∋ c∈[0-9A-Za-z]))
⇔
(∃c∈s ∋ c∉[0-9A-Za-z ]) ∨ (∀c∈s c∉[0-9A-Za-z])
⇔
(∃c∈s ∋ c∈[^0-9A-Za-z ]) ∨ (∀c∈s c∈[^0-9A-Za-z])

Итак, теперь мы хотим построить регулярное выражение, которое либо содержит не-буквенно-цифровой, и непространственный символ, либо состоит только из букв без букв.

Первое легко: [^0-9A-Za-z ].
Второе похоже на это: ^[^0-9A-Za-z]*$

Объедините их вместе, чтобы получить: [^0-9A-Za-z ]|^[^0-9A-Za-z]*$

Теперь нам нужно отменить это регулярное выражение. Очевидно, что мы могли бы просто сделать (?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$). Или мы могли бы вручную отменить регулярное выражение:

[^0-9A-Za-z ] становится ^[0-9A-Za-z ]*$
^[^0-9A-Za-z]*$ становится [0-9A-Za-z]. (примечание: мы могли бы с легкостью приехать сюда с самого начала)

Но теперь нам нужно объединить их с AND, а не OR:

Так как [0-9A-Za-z] является подмножеством [0-9A-Za-z ], мы можем просто сделать это:

^[0-9A-Za-z ]*[0-9A-Za-z][0-9A-Za-z ]*$

Обратите внимание, что мы можем упростить его до:

^[0-9A-Za-z ]*[0-9A-Za-z][ ]*$

Это просто требует, чтобы символ, который соответствует [0-9A-Za-z], является последним символом, который может это сделать. Мы могли бы также сделать

^[ ]*[0-9A-Za-z][0-9A-Za-z ]*$

Для этого потребуется, чтобы символ, который соответствует [0-9A-Za-z], является первым символом, который может это сделать.

Итак, теперь все готово. Мы можем использовать один из них или (?![^0-9A-Za-z ]|^[^0-9A-Za-z]*$).

Примечание: String#match действует так, как если регулярное выражение ^ + regex + $ (где + является конкатенацией). Это может отбросить несколько вещей.

Ответ 7

try {
    if (subjectString.matches("(?i)^(?=.*\\s*)(?!.*_)(?=.*[\\w]+)[\\w ]+$")) {
        // String matched entirely
    } else {
        // Match attempt failed
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

Или просто:

^(.*\p{Blank}?\p{Alnum}+.*\p{Blank}?)$

Пример