Расстояние между регулярным выражением

Мы можем вычислить своего рода расстояние между регулярными выражениями?

Идея к mesure, в котором пути два регулярных выражения подобны.

9
задан kennytm 25 January 2010 в 11:18
поделиться

6 ответов

Если у вас есть два регулярных выражения и имеют набор примеров входов, которые вы можете попробовать соответствовать каждому входу против каждого Regex. Для каждого ввода:

  • Если они оба соответствуют, либо оба не совпадают, набрать 0.
  • , если один совпал, а другой нет, оценка 1.

Суммируйте эту оценку по всем входам, и это будет Дайте вам «расстояние» между регулярными выражениями. Это даст вам представление о том, как часто два регулярных выражения будут отличаться для типичного ввода. Это будет очень медленно рассчитать, если ваш набор ввода образца большой. Это вообще не будет работать, если оба Regexes не могут соответствовать практически все случайные строки, и ваш ожидаемый вход совершенно случайно. Например, Regex 'Sgjlkwren' и Regex 'Ueuenwkaalf', вероятно, никогда не совпадают с чем-либо, если тестируются на случайном входе, поэтому эта метрика скажет, что расстояние между ними равна нулю. Это может или не может быть то, что вы хотите (вероятно, нет).

Вы сможете проанализировать структуру регулярного выражения и использовать смещенную случайную выборку для преднамеренного удара строк, которые совпадают чаще, чем в полностью случайном входе. Например, если оба Regeex требуют, чтобы строка запускается с «Foo», вы можете убедиться, что ваши тестовые входы также всегда начинаются с FOO, чтобы не тратить время тестирования времени, которые вы знаете, потерпят неудачу для обоих.

Так что в заключение: если у вас нет особой ситуации с ограниченным набором ввода и / или ограниченным регулярным выражением языка выражения, я бы сказал, что это невозможно. Если у вас есть некоторые ограничения на ваш вход и на регулярное выражение, это может быть возможно. Пожалуйста, укажите, какие эти ограничения есть и, возможно, я могу придумать что-то лучше.

2
ответ дан 4 December 2019 в 13:01
поделиться

Есть несколько метрик, которые вы могли бы использовать:

  1. длина действительного совпадения. Некоторые Regexs имеют фиксированный размер, некоторые верхний предел и некоторые нижний предел. Сравните, насколько похожими их длины или возможные длины.

  2. Персонажи, которые совпадают. Любое регулярное выражение будет иметь набор символов, который может содержать совпадение (может быть, все символы). Сравните набор включенных символов.

  3. Используйте большой документ и посмотрите, сколько совпадает каждый регельс, и сколько из них идентичны.

Вы ищете строгую эквивалентность?

5
ответ дан 4 December 2019 в 13:01
поделиться

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

5
ответ дан 4 December 2019 в 13:01
поделиться
-

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

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

2
ответ дан 4 December 2019 в 13:01
поделиться

Там есть ответ, скрытый в более раннем вопросе здесь, так как: генерируют строки из Regexes . Вы можете рассчитать (асимметричную) меру расстояния, создавая строки, используя одно регенцию и проверку того, сколько из них соответствуют другому Regeex.

Это может быть оптимизировано путем размораживания общих префиксов / суффиксов. Например. A [0-9] * и A A [0-7] * Поделитесь префиксом A [111652] A A префикс , поэтому вы можете рассчитать расстояние между [0 -9] * и [0-7] * вместо этого.

1
ответ дан 4 December 2019 в 13:01
поделиться

Я думаю, что сначала нужно понять для себя, как вы видите «разницу» между двумя выражениями. В основном определите метрику расстояния.

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

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

Все еще я считаю, что мы могли думать о чем-то, но не в целом, а для одного конкретного и довольно ограниченного случая. У вас есть какой-то пример, чтобы показать нам?

1
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: