Как соответствовать “какому-либо символу” в регулярном выражении?

Проблема решена. Это было в линии

a.HasKey("NameId", "Id");

в OnModelCreating метод. Я использовал пример , где было написано большое количество настроек коллекций собственных типов.

После удаления поля «NameId» из определения ключа

a.HasKey("Id");

теперь все работает нормально.

269
задан Wiktor Stribiżew 18 June 2018 в 12:59
поделиться

7 ответов

Да, вы можете. Это должно сработать.

  • . = любой символ
  • \. = собственно символ точки
  • .? = .{0,1} = совпадение любого символа ноль или один раз
  • .* = .{0,} = совпадение любого символа ноль или более раз
  • . + = .{1,} = совпадение любого символа один или более раз
593
ответ дан 23 November 2019 в 02:19
поделиться

[^] должен соответствовать любому символу, включая новую строку. [^ СИМВОЛЫ ] соответствия все символы за исключением тех, которые в СИМВОЛЫ . Если СИМВОЛЫ пусты, это соответствует всем символам.

пример JavaScript:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
1
ответ дан 23 November 2019 в 02:19
поделиться

.* и .+ для любых символов за исключением новых строк.

Двойной Выход

На всякий случай, Вы были бы требуемый для включения новых строк, следующие выражения могли бы также работать на те языки, которые удваиваются, выход требуется, такие как Java или C++:

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

для нуля или больше раз, или

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

в течение одного или нескольких раз.

Единственный Выход:

Двойной выход не требуется для некоторых языков такой как, C#, PHP, Ruby, Perl, Python, JavaScript:

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}

Вывод

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123
<час>

, Если Вы хотите исследовать выражение, оно было объяснено на верхней правой панели regex101.com . Если бы Вы хотели бы, можно также смотреть в эта ссылка , как она соответствовала бы против некоторых демонстрационных исходных данных.

<час>

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

1
ответ дан 23 November 2019 в 02:19
поделиться

Нет, * будет соответствовать нулю или более символов. Вместо этого вы должны использовать + , что соответствует одному или нескольким параметрам.

Это выражение может подойти вам лучше: [A-Z] +123

9
ответ дан 23 November 2019 в 02:19
поделиться

Да, это сработает, но обратите внимание, что . не будет соответствовать символам новой строки, если вы не передадите флаг DOTALL при компиляции выражения:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
53
ответ дан 23 November 2019 в 02:19
поделиться

Используйте шаблон . для однократного сопоставления любого символа, . * для сопоставления любого символа ноль или более раз, . + для сопоставления любого символа один или несколько раз.

20
ответ дан 23 November 2019 в 02:19
поделиться

Существует множество сложных инструментов для тестирования и разработки regex, но если вам нужен простой тестовый харнесс на Java, вот один из них для вас:

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

Теперь вы можете легко добавлять новые тестовые примеры и пробовать новые шаблоны. Получайте удовольствие от изучения regex.

См. также

11
ответ дан 23 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: