Как «крутая» полоса Firefox соответствует строкам?
Вопрос в том, как выполняется сопоставление строк, чтобы найти совпадающие записи в firefox 3 панель URL. Сопоставление подстрок в каждой записи может быть медленным. Какой алгоритм можно использовать для быстрого сопоставления в любом месте?
Ответы (4)
Обычный способ быстрого сопоставления подстрок — создать структуру данных, содержащую все суффиксы всех строк, которые вы хотите найти. В зависимости от организации это можно назвать «суффиксным деревом» или «суффиксным массивом». Например, если у вас есть 1000 строк, каждая из которых имеет длину 50 символов, у вас есть 1000 x 50 нетривиальных суффиксов, т. е. ваш массив суффиксов будет содержать 50 000 записей.
Затем, чтобы выполнить сопоставление, вы выполняете двоичный поиск (если массив) или поиск по дереву (если дерево), чтобы найти все те суффиксы в структуре данных, начало которых соответствует строке, написанной в поле поиска. Поскольку это начало искомого суффикса, вы можете использовать стандартные процедуры поиска (бинарный поиск, спуск по дереву), чтобы быстро получить результат. Каждый суффикс связан с теми строками, в которых он появляется.
Пример: у вас есть две строки «CAT» и «DOT». Ваш массив суффиксов выглядит следующим образом (обратите внимание на лексиографический = алфавитный порядок):
Обратите внимание, что есть шесть суффиксов, но два из них одинаковы (последняя буква «T» в «CAT» и «DOT»), и оба они представлены одной и той же записью (# 5).
Теперь, когда пользователь вводит поиск, например. «OT» (которое должно совпадать с «DOT»), вы можете выполнить простой лексиографический поиск по порядку во время регистрации, так как сейчас вы ищете начало совпадения в массиве суффиксов.
Это основной принцип быстрого поиска текста, когда шаблон поиска не содержит подстановочных знаков.
Убедитесь, что строка соответствует формату строки
В Java, как вы можете определить, соответствует ли строка строке (т.е.: song%03d.mp3 )?
Другими словами, как реализовать следующую функцию?
Может быть, есть способ конвертировать строку формата в регулярное выражение?
Разъяснение
Формат String — это параметр. Я не знаю этого заранее. song%03d.mp3 является просто примером. Это может быть любая другая форматная строка.
Если это помогает, я могу предположить, что в строке формата будет только один параметр.
7 ответов
Я не знаю о библиотеке, которая это делает. Ниже приведен пример преобразования шаблона формата в регулярное выражение. Обратите внимание, что Pattern.quote важно обрабатывать случайные регулярные выражения в строке формата.
Конечно, реализация convertToken будет проблемой. Начнем с того, что:
Поскольку вы заранее не знаете формат, вам придется написать метод, который преобразует строку формата в regexp. Не тривиально, но возможно. Вот простой пример для двух тестовых таблиц, которые вы указали:
и некоторый тестовый код:
Вы можете использовать String.matches; хотя вам нужно будет использовать регулярное выражение, а не строку формата.
Не следует слишком сложно заменить что-то вроде% 03d эквивалентом регулярного выражения \d
Убедитесь что поисковая строка соответствует формату примера
В Java, как вы можете определить, соответствует ли строка строке (т.е.: song%03d.mp3 )?
Другими словами, как реализовать следующую функцию?
Может быть, есть способ конвертировать строку формата в регулярное выражение?
Разъяснение
Формат String — это параметр. Я не знаю этого заранее. song%03d.mp3 является просто примером. Это может быть любая другая форматная строка.
Если это помогает, я могу предположить, что в строке формата будет только один параметр.
7 ответов
Я не знаю о библиотеке, которая это делает. Ниже приведен пример преобразования шаблона формата в регулярное выражение. Обратите внимание, что Pattern.quote важно обрабатывать случайные регулярные выражения в строке формата.
Конечно, реализация convertToken будет проблемой. Начнем с того, что:
Поскольку вы заранее не знаете формат, вам придется написать метод, который преобразует строку формата в regexp. Не тривиально, но возможно. Вот простой пример для двух тестовых таблиц, которые вы указали:
и некоторый тестовый код:
Вы можете использовать String.matches; хотя вам нужно будет использовать регулярное выражение, а не строку формата.
Не следует слишком сложно заменить что-то вроде% 03d эквивалентом регулярного выражения \d
Убедитесь, что строка соответствует требуемому формату
Я пытаюсь проверить, соответствует ли строка определенному формату, проверяя, что:
- item[]= повторяется четыре раза
- За item[]= следует число и символ & (например, item[]=2& ), за исключением того, что после последнего числа не ставится & .
- Цифры после item[]= состоят только из 1–4 и могут располагаться в любом порядке, но не повторяться.
Вот несколько примеров того, как будет выглядеть строка (как видите, порядок номеров меняется) — обратите внимание, что одновременно будет только одна строка!
Регулярное выражение Javascript, чтобы убедиться, что строка соответствует формату x: y
Я пытаюсь разобрать строку с двумя числами, оба могут быть от 1 до 3 цифр, и между ними будет двоеточие. Вот некоторые примеры:
Кроме того, данная строка также может быть недействительной, и мне нужно определить, так ли это. Мои попытки проверить правильность строки выглядели так: .match(/[1-9]\:[1-9]/);. Но потом я заметил, что это не сработает, если введена такая строка: «characters12:4characters». Как мне проверить строку, чтобы убедиться, что она имеет формат x: y?
Любая помощь будет принята с благодарностью.
10:100 действителен? Я так понимаю, 010:100 нет, не так ли?
Да, x может быть от 1 до 3 цифр, то же самое для y. Тогда строка должна быть в формате x:y
Убедитесь что поисковая строка соответствует формату примера
Так ведь тема про загрузку отчетов на сайте СФРа https://es.pfrf.ru/:
раздел:
Отчетность
Подать отчетность страхователя в электронном виде без посещения СФР
Для предоставления сведений в электронном виде необходимо авторизоваться в Единой системе идентификации и аутентификации (ЕСИА) и подписать усиленной квалифицированной электронной подписью (УКЭП).
Загрузить и отправить на обработку подготовленный файл отчётности:
Загрузить подготовленный файл отчетности (СЗВ‑ТД, СЗВ‑М, ОДВ‑1, СЗВ‑СТАЖ, СЗВ‑КОРР, СЗВ‑ИСХ, ЕФС‑1)
Пашнина Алена |
Посмотреть профиль |
Отправить личное сообщение для Пашнина Алена |
Найти все сообщения от Пашнина Алена |
Тоже самое с ЕФС-1, на XML-файл, при попытке загрузить его через сервис es.pfrf.ru
тот ругается , что "не валиден или не соответствует выбранному типу "ЕФС-1".
И опять ПО ПД на файл не ругается, все корректно
Сергей 4715 |
Посмотреть профиль |
Отправить личное сообщение для Сергей 4715 |
Найти все сообщения от Сергей 4715 |
Тоже самое с ЕФС-1, на XML-файл, при попытке загрузить его через сервис es.pfrf.ru
тот ругается , что "не валиден или не соответствует выбранному типу "ЕФС-1".
И опять ПО ПД на файл не ругается, все корректно
ОКФС 12 – к этой группе относится вся федеральная собственность; ОКФС 13 – собственность субъектов РФ; ОКФС 14 – муниципальная собственность; |
Да я сам удивляюсь, ведь другие файлы XML проходят , например через сервис налоговой .
Может и в СФРе что-то не так. Плохо, что там нет какой либо выгрузки ошибок оттуда.
кстати, ОКФСа в файлах вобще нет
Как я могу убедиться, что строка соответствует определенному формату?
Как проверить, соответствует ли строка определенному формату? Например, как я могу проверить, соответствует ли строка формату IP-адреса, прокси-адреса (или любого настраиваемого формата)?
Я нашел этот код, но я не могу понять, что он делает. Пожалуйста, помогите мне понять процесс создания строки соответствия.
Соответствие регулярных выражений упрощается:
Этот код вызывает некоторые действия, если строка whatever соответствует регулярному выражению you_regexp .
Итак, каковы они, эти регулярные выражения (такие же, как сокращение регулярных выражений или регулярных выражений)? Это не что иное, как строковые шаблоны, предназначенные для использования в качестве фильтров для других строк.
Предположим, что у вас много заголовков HTTP, и вы хотите получить только GET moofoo HTTP/1.1 . Вы можете использовать метод string.Contains(other_string) , но регулярные выражения делают этот процесс более подробным, безошибочным, гибким и удобным.
Regexp состоит из блоков, которые могут быть использованы для замены в будущем. Каждый блок определяет символы, которые вся строка может содержать в некоторой позиции. Блоки позволяют вам определять эти символы или использовать шаблоны для облегчения вашей работы.
Символы, которые могут быть или не быть в текущей позиции строки, определяются следующим образом:
-
Если вы уверены, что эти символы ДОЛЖНЫ быть там, просто используйте их «как есть». В нашем примере это соответствует HTTP word — это всегда присутствует в заголовках HTTP.
Если вы знаете все возможные варианты, используйте оператор | (logic OR ). Примечание. все варианты должны быть заключены в знаки блока — круглые скобки. Подробнее читайте ниже. В нашем случае это соответствует словам GET — этот заголовок может использовать слова GET , POST , PUT или DELETE .
если вы знаете все возможные диапазоны символов, используйте блоки диапазона: например, литералы могут быть определены как [a-z] , [\w] или [[:alpha:]] . Квадратные скобки являются признаками блоков диапазона. Они должны использоваться с оператором count. Этот используется для определения повторений. Например. если ваши слова/символы должны быть сопоставлены один или несколько, вы должны определить, что с помощью:
-
? (означает «может присутствовать и быть не может» )
+ (означает «один или несколько» )
* (означает «ноль или больше» )
(означает ‘A или больше’)
(означает «не менее A и не больше B раз» )
<,B>(означает «не более B» )
если вы знаете, какие диапазоны символов не должны присутствовать, используйте оператор NOT ( ^ ) в пределах диапазона в самом начале: [^a-z] соответствует 132==? , тогда как [^\d] соответствует by abc==? ( \d определяет все цифры и равно [0-9] или [[:digit:]] ). Примечание. ^ также используется для определения самого начала всей строки, если она не используется в пределах блока диапазона: ^moo соответствует moofoo , а не foomoo . Чтобы закончить идею, $ соответствует самому окончанию всей строки: moo$ будет соответствовать foomoo , а не moofoo .
если вам не нравится, какой символ соответствует, используйте звезду: .* является наиболее часто используемым шаблоном для соответствия любому количеству символов.
Примечание. все блоки должны быть заключены в круглые скобки ( (phrase) — хороший пример блока).
Примечание: все нестандартные и зарезервированные символы (такие как символ табуляции \t , круглые скобки ( и ) и т.д.) должны быть экранированы (например, слэш перед представлением символов: \( , \t, , \. ), если они не принадлежат к какому-либо блоку и должны быть сопоставлены как-есть. Например, в нашем случае в блоке HTTP/1.1 есть две escape-последовательности: \/ и \. . Эти два должны быть сопоставлены как есть.
Используя весь текст до того, как я набрал около 30 минут, позвольте ему использовать его и создайте регулярное выражение для соответствия нашему примеру HTTP-заголовку:
(GET|POST|PUT|DELETE) будет соответствовать методу HTTP
Сбор всех этих операторов вместе даст нам это регулярное выражение: ^(GET|POST|PUT|DELETE)\ HTTP\/(\d+\.\d+)$ .