2013-06-04 1 views
2

Я пытаюсь соответствовать шаблону, которые представляют измерение, как:Как упростить следующее регулярное выражение

2,2x3 
3*5 
4 X 44,5 
5x5x5 

Числа могут быть либо двойной (с помощью точки или запятой) или Int. Сепаратор может быть либо xX */\ (и его можно смешать, например: 5 * 3x9). В измерении не более трех чисел, а третий не является обязательным (я часто сопоставляю только 2 измерения). Между числом и разделителем может быть любое количество пробелов. Im используя регулярное выражение, которое работает тихий хорошо, но я задавался вопросом, будет ли какой-либо простой способ его достижения:

(\d+[.,]?\d*)\s*[xX*/\\]\s*(\d+[.,]?\d*)(\s*[xX*/\\]\s*(\d+[.,]?\d*))? 
+0

Вы можете использовать следующее [regex] (http://regex101.com/r/wM6qV6). – HamZa

+0

Почему это должно быть одно регулярное выражение? Вы можете разбить его на 4 разных, каждый из которых намного проще, чем у вас. – Oded

+0

Хороший сайт, но это иронично, хотя в Интернете используется регулярное выражение для поиска шаблона регулярных выражений для описания синтаксиса regex – Fendy

ответ

2

Я отправил предыдущий ответ, где я неправильно понял часть вашего вопроса. Так что это повторение.

Честно говоря, это лучший Regex себе:

(\d+(?:[.,]\d+)?)\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?)(?:\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?))? 

Почему? Потому что с этим утверждением у вас есть группа 1, группа 2 и группа 3, из которых вы можете вывести три значения (третий может иногда быть пустым, очевидно). Если вы используете кванторы для повторения подвыражения, вам придется попасть в коллекцию групп, и ваш код станет беспорядочным.

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

Но если короче маршрут вы хотите принять, то Regex будет:

(\d+(?:[.,]\d+)?)(?:\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?)){1,2} 

В этом случае ваш код может тянуть первое значение из группы 1, но тогда придется использовать группу чтобы увидеть, есть ли у группы 2 стек или только одно значение. Если это стек, возьмите элемент сбора коллекции 0 для значения 2, затем возьмите элемент сбора 1 для значения 3.

Эти регулярные выражения очень похожи на Stema's, за исключением того, что они организуют группы захвата.

The Breakdown:

(    //Capture Group 1 - Begin 
    \d+   //Require Digits 
    (?:   //Non Capture Sub Expression 
    [.,]\d+ //Allow a "Decimal", but if it exists, Require Digits after it 
)?   //Optional Quantifier for the "decimal" sub-expression 
)    //Capture Group 1 - End 
(?:   //Non Capture Sub Expression 
    \s*   //Optionally capture space(s) 
    [xX*/\\]  //Require a Separator 
    \s*   //Optional capture space(s) 
    (   //Capture Group 2 - Begin 
    \d+  //Require Digits 
    (?:  //Non Capture Sub Expression 
     [.,]\d+ //Allow a "Decimal", but if it exists, Require Digits after it 
    )?   //Optional Quantifier for the "decimal" sub-expression 
)   //Capture Group 2 - End 
){1,2}   //Require at least one Separator/Digit pattern, but allow two 

Опять же, разница между моим "коротким" ответом и Stema, является только что шахта обрабатывает "Десятичную" более уместно. Но вы можете не требовать дополнительной безопасности, и в этом случае stema's в порядке. Кроме того, используйте выражения non-capture, когда вы просто используете подвыражение для группировки или повторения, и не хотите его захватывать. В конечном итоге добавление значений в эти стеки немного влияет на скорость обработки.

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

3

Вы можете использовать квантор {1,2}, означает соответствие один или два раза. Последняя необязательная группа совпадает с прошлым в середине вашего регулярного выражения. поэтому просто удалите дублированную часть и используйте этот квантификатор в группе.

(\d+[.,]?\d*)(\s*[xX*/\\]\s*(\d+[.,]?\d*)){1,2} 

Посмотри это here on Regexr. Я добавил анкеры ^ и $, зависит от метода, который вы используете в .net, если они вам нужны или нет.

+0

это не сделало бы этого, так как совпадение в два раза это не совпадает с совпадением шаблона с 3-м номером: эта версия не позволяет 3 * 3 * 3. – C4stor

+0

@ C4stor проверить ссылку regexr. Конечно, это соответствует «3 * 3 * 3». Я просто удалил последнюю необязательную часть. – stema

+0

@stema возникла бы проблема, если бы был введен 4D lol – HamZa

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

  • Нет связанных вопросов^_^