|
Регулярные выражения и спец. символы | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
21.05.15
✎
12:38
|
Добрый день. Не так часто использую регэкспы, вот пришлось - столкнулся с задачей сложного распознавания, и возник такой вопрос.
Возьмем простую задачу. Требуется распознать строку вида: "Что нибудь 0,5" - т.е. строка и дробное число. Это легко решается паттерном: ^[ а-я]+(\d+(,?\d+)*)+$ Теперь нужно подумать, а что если в строке есть также спец. символы? Т.е. символы из такой строки: "'!@#№$;%^:&?*+=-_{}[]/\<>,.~`. Берем для поиска контрольную строку, вида: "Что !@"'#№$;%^:&?*+=-_{}[]/\<>,.~` нибудь 0,5" У меня вопрос: как корректно описать строку спецсимволов? Неужели нужно городить огород с экранированиями и проч., ведь если использовать паттерн вида [^[\D\S]+(\d+(,?\d+)*)+$] - находятся все строки массива, т.е. условие что пред дробным выражением только строка с спецсимволами ([\D\S]) - не срабатывает. |
|||
1
Zhuravlik
21.05.15
✎
12:47
|
Видимо опечатался, последний паттерн -
^[\D\S]+(\d+(,?\d+)*)+$ т.е. вначале любые символы кроме цифровых и пробельных, потом целое/дробное число и конец строки. А оно ищет вообще все, т.е. например строка "Что нибудь 09 раз 1,2 два" - в первый паттерн не попадет, а в этот попадет. |
|||
2
Zhuravlik
21.05.15
✎
12:51
|
+ Если с экранами, то получается вот такой паттерн:
^[ "'!@#№$;%^:&?*+=\-_{}[\]\/\\<>,\.~` а-я]+(\d+(,?\d+)*)+$ - он работает. По идее должен быть равен паттерну ^[\D\S]+(\d+(,?\d+)*)+$ Или я не прав? |
|||
3
Кирпич
21.05.15
✎
15:18
|
мож так прокатит?
^[^\d]+(\d*,?\d+)$ |
|||
4
Fragster
гуру
21.05.15
✎
15:20
|
\S - все непробельные символы.
|
|||
5
Fragster
гуру
21.05.15
✎
15:22
|
.*(\d+(,\d+)?)$
|
|||
6
Timon1405
21.05.15
✎
15:26
|
(5)
"555.123.4567 +1-(800)-555-2468" |
|||
7
Кирпич
21.05.15
✎
15:29
|
(6) да. с точкой погорячился
|
|||
8
Кирпич
21.05.15
✎
15:58
|
^([\S\ ]+)\s(\d*,?\d+$)
на случай, если в "Что нибудь" цифры попадаются типа "Что нибудь №22 0,5" |
|||
9
Zhuravlik
21.05.15
✎
16:12
|
(5) .* - нельзя, первая строка без цифр
(8) Сейчас попробую, только - не пойму: почему у вас признак конца строки ограничен скобкой? Разве так можно?.. |
|||
10
Кирпич
21.05.15
✎
16:14
|
(9) а почему нельзя? тебе кто то запрещал?
|
|||
11
Кирпич
21.05.15
✎
16:16
|
+(9) $ в скобках это ключевой момент в этом выражении. без него не взлетит
|
|||
12
Кирпич
21.05.15
✎
16:18
|
(11) хотя нет. взлетает. ну да ладна
|
|||
13
Zhuravlik
21.05.15
✎
16:21
|
(12) Насколько я понимаю логику регэкспов, это равносильно тому как записать пример "2x(5-3) = 4" вот так "2x(5-3=4)" - но я в них не силен, может и ошибаюсь.
Этот паттерн ищет лишь строку "Что !@"'#№$;%^:&?*+=-_{}[]/\<>,.~` нибудь 0,5", а должен еще икать и "Что нибудь 0,5". Сложно уловить задумку: вы получается смотрите все непробельные символы, т.е. цифры туда тоже должны попасть?.. |
|||
14
Zhuravlik
21.05.15
✎
16:25
|
Вот так работает ^([\S ]+)(\d*,?\d+)$ - пробел не нужно экранировать
|
|||
15
Кирпич
21.05.15
✎
16:27
|
(14) ну у меня и так работает. разные реализации.
http://www.imageup.ru/img254/2135194/bezymyannyjj.png.html |
|||
16
Кирпич
21.05.15
✎
16:29
|
(13) про логику и конец строки.
воспринимай $ как обычный символ, какой же как F или 9 или Я |
|||
17
Zhuravlik
21.05.15
✎
16:29
|
(15) Вот это да)) Я и не знал что в опен-офисе можно регулярками искать))
|
|||
18
Кирпич
21.05.15
✎
16:30
|
(17) и в MS офисе тоже
|
|||
19
Zhuravlik
21.05.15
✎
16:32
|
(16) Ну, он обычный, т.е. теряет свои спец. свойства - если заключен в перечисление ([]), а если он должен обозначать конец строки - его необходимо указывать строго в конце строки - так?
(18) Не знал, рулезз) |
|||
20
Zhuravlik
21.05.15
✎
16:37
|
Итоговый результат - ^([^0-9][\S ]+)(\d*,?\d+)$ - вначале не нужны цифры.
(18) Спасибо, вы очень помогли) |
|||
21
Кирпич
21.05.15
✎
16:41
|
(19) "его необходимо указывать строго в конце строки" если у тебя так, то так. просто бывают разные реализации регулярок.
|
|||
22
Timon1405
21.05.15
✎
16:42
|
не хочу расстраивать, но (20) не катит для
" xxx3 2" |
|||
23
Кирпич
21.05.15
✎
16:46
|
(22) а так?
^([^0-9\S ]+)(\d*,?\d+)$ |
|||
24
Zhuravlik
21.05.15
✎
16:53
|
(22) Сверяюсь по этому сайту - http://regexr.com/ - все получается.
Речь идет о регулярках в VBScript |
|||
25
Zhuravlik
21.05.15
✎
16:54
|
(22) и у вас в начале пробел
|
|||
26
Кирпич
21.05.15
✎
16:58
|
(22) у меня работает
|
|||
27
Zhuravlik
21.05.15
✎
17:00
|
(23) А можете объяснить на пальцах - в чем смысл групп -()- ?
Вот тут я их использую, чтобы указать что число может быть дробным, а может быть целым: \d+(,?\d+)* - т.е. для того чтобы поставить квантификатор "*" - ноль или более - для дробной части числа, я взял его в скобки. А у вас вот здесь - \d*,?\d+ -скобок нет (это кстати для моей задачи не подходит - ищутся строки вида xxxx ,09) - хотел уточнить зачем вы их убирали, чем руководствовались. |
|||
28
Timon1405
21.05.15
✎
17:02
|
(26) "r55 ,5" - регулярка находит совпадения, хотя не должна, как мне кажется. Смотрю на том же сайте (24)
|
|||
29
Кирпич
21.05.15
✎
17:04
|
(27) я их не убрал. я их просто не нарисовал.
для дробной части числа наверное нужно ноль или один. \d+(,?\d+)* наверное пропустит 1562,1236,12345 |
|||
30
Кирпич
21.05.15
✎
17:06
|
я специально сделал чтобы ,5 пропускало. это же 0,5
|
|||
31
Timon1405
21.05.15
✎
17:09
|
(30) (22) для строки ",1562,1236,12345" выдает совпадение, мне кажется совпадения здесь быть не должно
|
|||
32
Zhuravlik
21.05.15
✎
17:10
|
(29) Так и должно быть. В конце строки - строго число, либо целое, либо дробное.
(30) нет ,5 - это чей-то косяк) 0,5 - это дробь. |
|||
33
Кирпич
21.05.15
✎
17:12
|
\d+(,\d+)?
так будет правильно |
|||
34
Zhuravlik
21.05.15
✎
17:21
|
Да в общем устраивает так, как есть. Основной вопрос темы решен - вместо огорода экранов можно написать [^0-9][\S ]+ - а больше мне в общем-то и не нужно было. Свою задачку уже решу как-нибудь. Спасибо всем за помощь)
|
|||
35
Новый участник
21.05.15
✎
17:45
|
Ну уж нет. ПОказывай, где это можно применить в 1С.
|
|||
36
Zhuravlik
21.05.15
✎
18:47
|
(35) поиск regexp по инфостарту: http://catalog.mista.ru/public/64222/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |