Имя: Пароль:
1C
 
Регулярные выражения и спец. символы
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/
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший