Збігайте цілий рядок


165

Який регулярний вираз (у JavaScript, якщо він має значення) відповідає лише тому, що текст точно відповідає? Тобто, на іншому кінці рядка не повинно бути зайвих символів.

Наприклад, якщо я намагаюся під стать abc, а потім 1abc1, 1abcі abc1буде не збігатися.


5
Для тих, хто починає регулярно виражатись, є два хороших відповіді на це, залежно від того, що ви шукаєте. Запитуючий дуже хоче \babc\b, що дозволить, наприклад, 123 abc 123відповідати abc(але не негативні приклади, як у запитанні); проте ^abc$переконайтеся, що aце на початку рядка та cв кінці - інакше він не збігатиметься.
Андрій

Відповіді:


305

Використовуйте початкові та кінцеві роздільники: ^abc$


3
@Jake, я радий, як відповідь Howards спрацювала, але я думаю, ви повинні зауважити, що вона працюватиме лише тоді, коли лише abc є єдиним елементом у рядку. Наприклад, це не відповідає "перші 3 букви в алфавіті є abc"
матч

Це працювало для мене, можливо, моїм прикладом повинен був бути "abc def ghi" як цільовий матч.
Джейк Пірсон

@Jake, якщо в рядку було "abc def ghi", то / ^ abc $ / не працюватиме. наприклад: jsfiddle.net/XUyAc
матч

2
Я розумію, що якщо я хочу відповідати "abc def ghi", мій регекс був би^abc def ghi$
Джейк Пірсон

2
Примітка: щоб шаблон з чергуваннями відповідав цілій рядку, може знадобитися обернути його групою (не) захоплення: /^(?:abc|def)$/або /^(abc|def)$/. В іншому випадку, якщо група не використовується, /^abc|def$/буде відповідати abcна початку рядка АБО defв кінці рядка.
Wiktor Stribiżew

40

Це залежить. Ти міг

string.match(/^abc$/)

Але це не відповідатиме наступному рядку: 'перші 3 літери алфавіту є abc. не abc123 '

Я думаю, ви хочете використовувати \b(межі слів):

var str = 'the first 3 letters of the alphabet are abc. not abc123';
var pat = /\b(abc)\b/g;
console.log(str.match(pat));

Живий приклад: часі http://jsfiddle.net/uu5VJ/

Якщо попереднє рішення працює для вас, я б радив не використовувати його.

Це означає, що у вас може бути щось подібне:

var strs = ['abc', 'abc1', 'abc2']
for (var i = 0; i < strs.length; i++) {
    if (strs[i] == 'abc') {
        //do something 
    }
    else {
        //do something else
    }
}

Поки ви могли використовувати

if (str[i].match(/^abc$/g)) {
    //do something 
}

Це було б значно більш ресурсомістко. Для мене загальним правилом є для простого порівняння рядків використовувати умовний вираз, для більш динамічної картини використовувати регулярний вираз.

Докладніше про регулярні вирази JavaScript: https://developer.mozilla.org/uk/JavaScript/Guide/Regular_Expressions


12
@NiharSawant Це тому, що це не відповідь на питання, яке поставив ОП. ОП явно не хоче відповідати "" перші 3 букви алфавіту є abc ", а друге рішення тут не працює для узгодження загальних виразів, наприклад / ^ [abc] + $ /
DJClayworth

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.