2012-02-28 4 views
1

Есть ли механизм для измерения или сравнения того, насколько жесткий шаблон соответствует данной строке? По шаблону я имею в виду регулярное выражение или что-то подобное. Например, у нас есть строка «foobar» и два регулярных выражения: «fooba». и ". *" Оба шаблона соответствуют строке. Можно ли определить, что «fooba». более подходящий шаблон для данной строки, затем «. *»?Измерение «соответствия»?

ответ

0

Есть метрики и эвристики для строки «расстояние». Проверьте это, например, http://en.wikipedia.org/wiki/Edit_distance

Вот одна случайная реализация Java, пришедшая с поиском Google.

http://www.merriampark.com/ldjava.htm

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

Что касается вашего конкретного примера, IIRC, согласование регулярных выражений в Java приоритеты терминов путем сопоставления длины, а затем порядок, так что если вы используете что-то вроде

«(Foobar) | (. *)», Это будет соответствовать первому один, и вы можете определить это, просмотрев результаты, возвращенные для двух групп захвата.

+0

Нужно больше кофе, чтобы понять, но, по-видимому, это самый перспективный способ деги. Спасибо. – jekamax

0

Как об этом для идеи: Используйте длину регулярного выражения: length("fooba.") > length(".*"), так "fooba." конкретнее ...

Однако, это зависит от того, где регулярных выражений берутся и как точно вы должны быть как "fo.*|.*ba" будет длиннее "fooba.", поэтому решение не всегда будет работать.

+0

К сожалению, шаблоны, подобные «foob», «foo.», «Fo *.» обычно собираются вместе. В любом случае, благодарю вас за простой первый aproarch. – jekamax

+0

Предположим, вы всегда можете удалить любые альфа-символы из регулярного выражения, прежде чем сравнивать длину. – beny23

+0

... Или сделать некоторые эвристики для взвешивания специальных символов. Это может сработать. – jekamax

0

То, о чем вы просите, на самом деле не является свойством регулярных выражений.

Создайте перечисление, которое измеряет «близость», и создайте класс, который будет содержать заданное регулярное выражение, и значение близости. Это требует, чтобы вы определили, какое регулярное выражение считается «более близким», чем другое.

Создайте свои различные классы и отпустите их на свой код и сравните согласованные объекты, позволяя «самой близкой» подняться на вершину.

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

enum Closeness 
    Exact 
    PrettyClose 
    Decent 
    NotSoClose 
    WayOff 
    CouldBeAnything 
mune 

class RegexCloser 
    property Closeness Close() 
    property String Regex() 
ssalc 


var foo = new RegexCloser(Closeness := Exact, Regex := "foobar") 
var bar = new RegexCloser(Closeness := CouldBeAnything, Regex := ".*") 

var target = "foobar"; 

if Regex.Match(target, foo) 
    print String.Format("foo {0}", foo.Closeness) 
fi 

if Regex.Match(target, bar) 
    print String.Format("bar {0}", bar.Closeness) 
fi 
+0

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

Смежные вопросы