2016-09-01 2 views
0

У меня есть скрипт, который запускается, если введенное значение содержит подстроку 'sn', но мне нужно, чтобы он игнорировал любые экземпляры этой подстроки, если за ними сразу следует либо буква t, либо апостроф.Получить список слов, содержащих подстроку в строке

Причина этого в том, что введенное значение содержит порядковый номер устройства, и сценарий может выбрать серийный номер, потому что ему предшествуют буквы «sn». Проблема заключается в том, что если пользователь вводит такие слова, как «не был» или «нет» (может быть с апострофом или без него, в зависимости от того, кто его ввел), сценарий получает последний экземпляр «sn». Мне нужно, чтобы он полностью игнорировал эти слова.

код я использую для проверки «зп» является ...

var lowercase_name = subject.toLowerCase(); 
var has_sn = lowercase_name.indexOf("sn") > -1; 
if(has_sn === true){ 
    //do something 
} 
+0

Убрана часть JQuery в названии и JQuery тега, так как он не требует ничего. Работая над своим ответом прямо сейчас. –

+0

@ Karl-AndréGagnon thanks :) – tatty27

+1

В словаре есть 1629 совпадений для 'sn'. Фильтрация '' 'и' t' не удаляет многие из них. Я думаю, вы должны рассмотреть другой подход. –

ответ

2

Чтобы сделать что-то подобное шпагатом, indexOf не достаточно хорошо, так как вы не можете иметь исключение. Что хорошо, но является регулярным выражением. Ваше условие: «игнорировать любые экземпляры этой подстроки, если они немедленно». Это означает, что вы должны использовать негативный прогноз ((?!)).

В вашем случае, хорошее регулярное_выражение Шоуда быть:

var lowercase_name = subject.toLowerCase(); 
var has_sn = lowercase_name.match(/sn(?!['t])/); 
if(has_sn){ 
    //do something 
} 
  • (?!) = отрицательный взгляд вперед. Искать sn не следует, что находится после !
  • [] = "или" персонаж. Сопоставьте любой символ внутри скобок.

Теперь, если вы хотите сделать более сложную задачу, вы должны смотреть на какой-то regexp tutorials

+0

отлично работает, спасибо – tatty27

+0

Добро пожаловать. –

2

Вы хотите использовать регулярное выражение:

subject.match(/^sn/i) 

^ означает, в соответствии с начала string, ожидать символов sn прямо в начале. i на концах означает нечувствительность к регистру, поэтому вам не нужно преобразовывать subject в нижний регистр. Это не будет работать, если есть пробелы или любые другие символы в этом отношении до начала sn. Если вы хотите поддержать эти случаи, вам придется обрабатывать их соответственно.

Если вы знаете все символы, которые можно ожидать внутри серийного номера, вы можете использовать группу захвата регулярных выражений в соответствии со всем серийным номером. Следующее регулярное выражение может быть использовано, чтобы соответствовать любому SN с числами или словами:

/^(sn[0-9a-z]+)/i 

[0-9a-z]+ означает любую цифру (0-9) и любой знак алфавита (A-Z). + означает совпадение с 1 или более этими цифрами/символами, и поскольку это нечувствительное к регистру совпадение, оно будет соответствовать как нижним, так и верхним символам. Матч заканчивается сначала нелицензированным символом, например. с пробелом, символ (+, - и т. д.) и так далее.

Вы можете увидеть, как это работает регулярное выражение: link

Как вы можете видеть в связанном, например, вы можете проверить, если .match вернулся null, в этом случае это означает, что он ничего не найдено.

Этот подход будет обрабатывать серийные номера, как вы ожидаете, вместо того, чтобы игнорировать только те случаи, которые у вас есть. Вы никогда не должны предполагать, что пользователи будут писать правильные английские слова или английский или даже слова, имеющие какой-либо смысл. Игнорирование только слов, где «sn» сопровождается «nt» или «not», является плохим подходом. Если пользователь набирает «snooze», вы по-прежнему будете соответствовать этому как серийный номер, хотя я не думаю, что вы действительно этого хотите.

1

Здесь вы можете использовать регулярное выражение. Выражение sn[^t'] будет соответствовать любой строке, содержащей st, но не имеет апострофа или буквы t, следующих за ним.

В JavaScript код будет выглядеть следующим образом:

var has_sn = /sn[^t']/.test(lowercase_name) 
if (has_sn) { /* do something */ } 
1

Вы можете использовать регулярные выражения:

var name = "name" 
var patt = /sn[^t']/i 
if(patt.test(name)){ 
    //do something 
} 
1

Раствор без регулярных выражений:

var lowercase_name = subject.toLowerCase(); 
var index = lowercase_name.indexOf("sn"); 
var char = lowercase_name.substring(index+2, index+3); 
if(index != -1 && char != "t" && char != "'"){ 
    //do something 
} 
Смежные вопросы