Совпадение слова по префиксу - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь сопоставить строку по префиксу, который заканчивается определенным символом. Например, если моя строка равна "abcd" и оканчивается на #, то любое слово, являющееся префиксом "abcd", должно совпадать, если оно оканчивается на #. Вот несколько примеров, которые помогут проиллюстрировать шаблон:

Ввод : "ab#" дает true (поскольку "ab" является префиксом "abcd" и заканчивается #).

Ввод : "abcd#" дает true (поскольку "abcd" является префиксом "abcd" и заканчивается #).

Ввод : "bc#" дает false (поскольку "bc" не является префиксом из "abcd").

Ввод : "ab@" дает false (в то время как "ab" является префиксом из "abcd", оно не заканчивается #).

Ввод : "ac#" дает false (хотя "ac" содержится в "abcd", оно не начинается с префикса от "abcd").

Пока мне удалось прийтисо следующим выражением, которое, кажется, работает нормально:

/(abcd|abc|ab|a)#/

Хотя это работает, это не очень практично, так как более длинные слова длиной n сделают выражение довольно большим:

/(n|n-1|n-2| ... |1)#/

Есть ли способ переписать это выражение, чтобы оно было более масштабируемым и лаконичным?

ExДостаточно моей попытки (в JS):

const regex = /(abcd|abc|ab|a)#/; 

console.log(regex.test("abcd#")); // true
console.log(regex.test("ab#")); // true
console.log(regex.test("abc#")); // true
console.log(regex.test("abz#")); // false
console.log(regex.test("abc@")); // false

Редактировать: Некоторые из представленных решений хороши и делают то, что мне нужно, однако, для этого конкретного вопроса, я послерешение, которое использует чистые регулярные выражения для соответствия префиксу.

Ответы [ 5 ]

3 голосов
/ 03 октября 2019

Просто используйте String#startsWith и String#endsWith здесь:

String input = "abcd";
String prefix = "ab#";

if (input.startsWith(prefix.replaceAll("#$", "")) && prefix.endsWith("#")) {
    System.out.println("MATCH");
}
else {
    System.out.println("NO MATCH");
}

Редактировать: Версия JavaScript выше:

var input = "abcd";
var prefix = "ab#";

if (input.startsWith(prefix.replace(/#$/, "")) && prefix.endsWith("#")) {
   console.log("MATCH");
}
else {
    console.log("NO MATCH");
}
1 голос
/ 03 октября 2019

Вот опция левого поля JavaScript. Создайте и массив допустимых префиксов, используйте объединение в массиве, чтобы создать шаблон регулярного выражения.

var validPrefixes = ["abcd",
"abc", 
"ab", 
"a", 
"areallylongprefix"];

var regexp = new RegExp("^(" + validPrefixes.join("|") + ")#$");


console.log(regexp.test("abcd#"));// true
console.log(regexp.test("ab#")); // true
console.log(regexp.test("abc#")); // true
console.log(regexp.test("abz#")); // false
console.log(regexp.test("abc@")); // false
console.log(regexp.test("areallylongprefix#")); //true

Это может быть адаптировано к языку выбора тура, также удобно, если ваши префиксы динамически извлекаются из базы данных или подобного.

1 голос
/ 03 октября 2019

Попробуйте ^ab?c?d?#$

Объяснение:

`^` - match beginning of a string

`b?` - match match zero or one `b`

Остальное аналогично вышесказанному.

Демо

0 голосов
/ 03 октября 2019
/a(b(cd?)?)?#/

Или для более длинного примера, чтобы соответствовать префиксу "abcdefg #":

/a(b(c(d(e(fg?)?)?)?)?)?#/

Генерирование этого регулярного выражения не совсем тривиально, но некоторые варианты:

function createPrefixRegex(s) {
    // This method creates an unnecessary set of parentheses
    // around the last letter, but that won't harm anything.
    return new RegExp(s.slice(0,-1).split('').join('(') + ')?'.repeat(s.length - 2) + '#');
}

function createPrefixRegex2(s) {
    var r = s[0];
    for (var i = 1; i < s.length - 2; ++i) {
        r += '(' + s[i];
    }
    r += s[s.length - 2] + '?' + ')?'.repeat(s.length - 3) + '#';
    return new RegExp(r);
}

function createPrefixRegex3(s) {
    var recurse = function(i) {
        if (i >= s.length - 1) {
            return '';
        }
        if (i === s.length - 2) {
            return s[i] + '?';
        }   
        return '(' + s[i] + recurse(i + 1) + ')?';
    }   

    return new RegExp(s[0] + recurse(1) + '#');
}

Может произойти сбой, если входная строка не имеет префикса перед символом «#», и они предполагают, что последний символ в строке - «#».

0 голосов
/ 03 октября 2019

Вот моя попытка c #:

private static bool test(string v)
{
   var pattern = "abcd#";
   //No error handling
   return v.EndsWith(pattern[pattern.Length-1])
      && pattern.Replace("#", "").StartsWith(v.Replace("#",""));
}
Console.WriteLine(test("abcd#")); // true
Console.WriteLine(test("ab#")); // true
Console.WriteLine(test("abc#")); // true
Console.WriteLine(test("abz#")); // false
Console.WriteLine(test("abc@")); // false
Console.WriteLine(test("abc")); //false
...