ref: Как в javascript найти в массиве совпадение подстроки
Приведенное здесь решение является общим в отличие от решения 4556343 # 4556343 , котороетребуется предыдущий анализ для определения строки, с которой join()
, которая не является компонентом ни одной из строк массива.
Кроме того, в этом коде /!id-[^!]*/
более правильно, /![^!]*id-[^!]*/
для соответствия параметрам вопроса:
- "поиск в массиве ..." (строк или чисел, а не функций, массивов, объектов и т. Д.)
- "только для совпадения части строки"(совпадение может быть где угодно)
- "вернуть ... соответствующий ... элемент" (единственное, не ВСЕ, как в "... the ... elementS")
- "с полной строкой "(включая кавычки)
... Решения NetScape / FireFox (решение для JSON
см. ниже):
javascript: /* "one-liner" statement solution */
alert(
["x'!x'\"id-2",'\' "id-1 "', "item","thing","id-3-text","class" ] .
toSource() . match( new RegExp(
'[^\\\\]("([^"]|\\\\")*' + 'id-' + '([^"]|\\\\")*[^\\\\]")' ) ) [1]
);
или
javascript:
ID = 'id-' ;
QS = '([^"]|\\\\")*' ; /* only strings with escaped double quotes */
RE = '[^\\\\]("' +QS+ ID +QS+ '[^\\\\]")' ;/* escaper of escaper of escaper */
RE = new RegExp( RE ) ;
RA = ["x'!x'\"id-2",'\' "id-1 "', "item","thing","id-3-text","class" ] ;
alert(RA.toSource().match(RE)[1]) ;
отображает "x'!x'\"id-2"
.
Возможно, проверка массива для поиска ВСЕХ совпадений будет «чище».
/* literally (? backslash star escape quotes it!) not true, it has this one v */
javascript: /* purely functional - it has no ... =! */
RA = ["x'!x'\"id-2",'\' "id-1 "', "item","thing","id-3-text","class" ] ;
function findInRA(ra,id){
ra.unshift(void 0) ; /* cheat the [" */
return ra . toSource() . match( new RegExp(
'[^\\\\]"' + '([^"]|\\\\")*' + id + '([^"]|\\\\")*' + '[^\\\\]"' ,
'g' ) ) ;
}
alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;
отображает:
"x'!x'\"id-2"
"' \"id-1 \""
"id-3-text"
Using, JSON.stringify()
:
javascript: /* needs prefix cleaning */
RA = ["x'!x'\"id-2",'\' "id-1 "', "item","thing","id-3-text","class" ] ;
function findInRA(ra,id){
return JSON.stringify( ra ) . match( new RegExp(
'[^\\\\]"([^"]|\\\\")*' + id + '([^"]|\\\\")*[^\\\\]"' ,
'g' ) ) ;
}
alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;
отображает:
["x'!x'\"id-2"
,"' \"id-1 \""
,"id-3-text"
морщины:
- "Unescaped" глобальный RegExp равен
/[^\]"([^"]|\")*id-([^"]|\")*[^\]"/g
с \
можно найти буквально.Чтобы ([^"]|\")*
соответствовал строкам со всеми экранированными "
как \"
, сам \
должен экранироваться как ([^"]|\\")*
.Когда на это ссылаются как на строку, которая должна быть объединена с id-
, каждый \
должен быть снова экранирован, следовательно ([^"]|\\\\")*
! - Поиск
ID
, который имеет \
, *
, "
, ..., также должны быть экранированы через .toSource()
или JSON
или .... null
результаты поиска должны возвращать ''
(или ""
, как вПУСТАЯ строка, содержащая NO "
!) Или []
(для всего поиска). - Если результаты поиска должны быть включены в программный код для дальнейшей обработки, тогда необходимо
eval()
, напримерeval('['+findInRA(RA,ID).join(',')+']')
.
--------------------------------------------------------------------------------
Отступление:
Рейды и побеги?Является ли этот код противоречивым?
Семиотика, синтаксис и семантика /* it has no ... =! */
решительно объясняют выход из конфликта цитируемых литералов.
Означает ли "no =":
- "нет знака "=" "как в
javascript:alert('\x3D')
(Нет! Запустите его и посмотрите, что есть!), - " нет оператора javascript с оператором присваивания ",
- " нет равных "как и в «ничем не идентичном в любом другом коде» (предыдущие решения кода демонстрируют наличие функциональных эквивалентов),
- ...
Цитирование на другом уровне также можно выполнить с помощьюРежим URI протокола JavaScript ниже.(// комментарии заканчиваются на новой строке (иначе nl, ctrl-J, LineFeed, ASCII десятичный 10, восьмеричный 12, шестнадцатеричный A), который требует кавычек, поскольку вставка nl нажатием клавиши Return вызывает URI.)
javascript:/* a comment */ alert('visible') ;
javascript:// a comment ; alert( 'not' ) this is all comment %0A;
javascript:// a comment %0A alert('visible but %\0A is wrong ') // X %0A
javascript:// a comment %0A alert('visible but %'+'0A is a pain to type') ;
Примечание. Вырежьте и вставьте любую строку javascript:
в качестве URI непосредственного режима (по крайней мере, максимум? В FireFox), чтобы сначала использовать javascript:
в качестве схемы или протокола URI, а остальныекак этикетки JS.