регулярное выражение для проверки правильности форматирования строки - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть текст от стороннего API, точнее, SMS. Мне нужно убедиться, что он отформатирован следующим образом ren#firstname#lastname с регулярным выражением.

Первый # должен появиться в четвертом символе, второй # может быть где угодно после этого, но не в последнем или вторая последняя позиция строки И два # не должны следовать друг за другом.

Возможно ли это с помощью регулярных выражений и как я могу этого достичь?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020
ren#[a-zA-Z]+#[a-zA-Z]+

В противном случае, если «ren» может быть любым другим 3-буквенным словом, тогда

[a-zA-Z]{3}#[a-zA-Z]+#[a-zA-Z]+

Если вы также хотите принять числа, то

.{3}#.+#.+
0 голосов
/ 19 апреля 2020

Вот моя попытка подкреплена некоторыми юнит-тестами. Без сомнения, другие придумают превосходное регулярное выражение, подключат их к тесту и опробуют.

Редактировать

Мой оригинальный регулярный оператор выполняет свою работу, но я думаю, что ^[^#]{3}#[^#]+#[^#]{2,}$ от @CarySwoveland в комментариях - это регулярное выражение, поэтому я заменил его на его.

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

import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class SOExample {

    public boolean match(String s) {
        String pattern = "^[^#]{3}#[^#]+#[^#]{2,}$";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(s);
        return m.matches();
    }

    @Test
    public void match_returns_true_for_example_string() {
        assertTrue(match("ren#firstname#lastname"));
    }

    @Test
    public void match_returns_false_when_the_first_hash_is_not_the_forth_character() {
        assertFalse(match("renX#firstname#lastname"));
    }

    @Test
    public void match_returns_false_when_the_second_hash_is_in_the_last_position_of_the_string() {
        assertFalse(match("ren#firstname#"));
    }

    @Test
    public void match_returns_false_when_the_second_hash_is_in_the_second_last_position_of_the_string() {
        assertFalse(match("ren#firstname#l"));
    }

    @Test
    public void match_returns_false_when_the_the_two_hashes_do_not_follow_each_other() {
        assertFalse(match("ren#firstname##lastname"));
    }
}
0 голосов
/ 19 апреля 2020

Да, регулярное выражение будет ^.{3}#.*#.*$

Если вы хотите получить фактические значения трех полей, используйте группы захвата:

  ^(.{3})#(.*)#(.*)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...