Как не включать определенную строку в регулярное выражение

#java #regex

#java #регулярное выражение

Вопрос:

Мне нужно создать какой-то компилятор «синтаксиса Java» в университете. Я хочу использовать регулярное выражение для сопоставления типа переменной и имени переменной (int num , String str и т. Д.). Поэтому мне нужно, чтобы регулярное выражение соответствовало одному из типов переменных (String, int, char, boolean, double), а после этого хотя бы один пробел и имя переменной, но имя переменной МОЖЕТНЕ быть одним из этих типов. Как мне это сделать? Я пытался:

 (String|int|char|boolean|double)[s] ([a-zA-Z] [w]*^(String|int|char|boolean|double))
  

Я знаю, что это не синтаксис регулярных выражений Java (только один » вместо двух), но я попробовал это в http://regexpal.com / и это не работает.

Большое спасибо!

Ответ №1:

Отрицательный прогноз

^ не будет работать там, где она у вас есть (это якорь, который пытается утверждать, что мы находимся в начале строки). Но вы были близки, и если вы просто добавите ?! в начале следующих скобок, это превратится в отрицательный прогноз:

 (String|int|char|boolean|double)s (?!(?:String|int|char|boolean|double)b)[a-zA-Z] 
  

Смотрите демонстрацию

  • Удалены скобки вокруг s и w (ненужные).
  • Отрицательный взгляд (?!(?:String|int|char|boolean|double)b) назад утверждает, что то, что следует, не относится к вашим типам. Если утверждение выполнено успешно, движок переходит к соответствию вашей переменной, указанной [a-zA-Z]
  • Для получения дополнительной информации об обходных путях см. Справочный раздел.

Ссылка

Комментарии:

1. К вашему сведению, исправлена небольшая ошибка, добавлена демонстрация. Дайте мне знать, если у вас есть вопросы. 🙂

2. Добро пожаловать, рад это слышать! Поскольку это работает, не могли бы вы, пожалуйста, нажать на галочку слева от ответа, чтобы отметить, что вы его принимаете? Так работает система повторений, принятие ответов зарабатывает репутацию как для ответчика, так и для вас. Приветствия!

3. Конечно, никаких проблем. Но я обнаружил, что это работает не так хорошо, как я думал — потому что, например, «int intro» должен работать, а в вашем решении это не так. Я имею в виду, что мне нужно, чтобы она принимала все, кроме фактической строки «int».

4. Извините, я новичок на этом сайте, не могли бы вы прислать мне ссылку на другой вопрос? Я с радостью приму это. еще раз спасибо.

5. Кстати, по этому вопросу я понятия не имею, был ли ответ правильным для вас. Просто приятно услышать отзывы. 🙂 Дайте мне минутку.

Ответ №2:

Ответ, который, я думаю, работает для всех случаев..

 public static void main(String[] args) {
    String s = "String String1";
    System.out.println(s.matches("(?!((String|double)\s (String|double|\d |$)$))(.*)"));
} 

O/P :
String s = "String String1";
answer : true

String s = "String String";
answer : false

String s = "String 123";
answer : false

String s = "String ";
answer : false