Страницы: 1
RSS
проблема с регулярным выражением для поиска одиночных символов по условию
 
Добрый день!
Столкнулся с задачей по поиску  прямых слешей в строке.
Условия:
  • Слева от него не стоит /
  • Справа от него не стоит /
  • Последовательность состоит из одного слеша: /
На python все решается через отрицательную негативную проверку:
Код
(?<!/)/(?!/)
Но в VBA нет отрицательной проверки.
Прошу подсказать, в каком направлении идти.
Заранее Всем большое спасибо!
 
Код
Function Slasha$(s)
  Dim re, ms
  Set re = CreateObject("VBScript.RegExp"): re.Global = True
  re.Pattern = "(^|[^/])/($|[^/])"
  If re.test(s) Then Set ms = re.Execute(s): Slasha = String(ms.Count, "/")
End Function

только в первой строке 6 одиночных слешей, а не 7, как у вас в файле
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо большое! Но там действительно 7 совпадений. Написал следующее регулярное выраение:
Код
/(?#следующая часть строки - это до)(?=[^/]+(?![^/]))
Уперся в проверку того, чтобы перед / не стоял такой же символ /. Пойду думать дальше.
Заранее спасибо всем откликнувшимся.
 
действительно 7(((
Код
re.Pattern = "(^|[^/])/(?=($|[^/]))"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
или так
Код
re.Pattern = "[^/]/(?!/)"
 
Цитата
testuser написал:
или так
и пишет что тут: /text/
нет одиночных слэшей
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
нет одиночных слэшей
Один есть, так правильней
Код
"(^|[^/])/(?!/)"
 
Всем большое спасибо!
Но хотелось бы найти только / стоящие отдельно (то есть последовательности ///// и подобные не учитываются), без других символов. Только используя одно регулярное выражение.
Думал сегодня и ничего так и не придумал. Пойду дальше учить матчасть и читать.

Всем откликнувшимся ещё раз большое Спасибо!
Изменено: artemkau88 - 11.08.2023 17:51:31
 
artemkau88,
а что тут не так?:
Код
Pattern = "(^|[^/])/(?=($|[^/]))"

название темы:
как регулярными выражениями вытащить из строки только ОДИНОЧНЫЕ слешы "/"
ответ:
Код
Pattern = "(^|[^/])/(?=($|[^/]))"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
testuser написал:
Один есть
один???
/text/
и начальный и конечный слэш - одиночные. в приведенной строке 2 одиночных слэша
а в первой строке из файла artemkau88 их семь
Цитата
artemkau88 написал:
Но хотелось бы найти только / стоящие отдельно
а приведенный в сообщении 4 паттерн какие ищет? что-то пропустил? или посчитал что-то лишнее? что не так?
Изменено: Ігор Гончаренко - 11.08.2023 23:26:30
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
artemkau88 написал:
проблема с регулярным выражением для поиска одиночных символов по условию
1. проблемы нет
2. поиск одиночных символов - это и есть условие (ни справа, ни слева от искомого символа не должны находиться такие же символы
Код
Function SingleCharCnt(s$, char$)
  Dim re, ms, m, i, v$
  Set re = CreateObject("VBScript.RegExp"): re.Global = True
  re.Pattern = "(^|[^" & char & "])" & char & "(?=($|[^" & char & "]))"
  If re.test(s) Then
    Set ms = re.Execute(s): SingleCharCnt = ms.Count
  End If
End Function

и результатом функции логичнее должно бы быть количество таких символов, потому что 7 слешей в качестве ответа, требуют их еще пересчитать, а сколько их там? потому что все 7 НИКАК не обьясяют откуда они были взяты все семеро))
приведенная выше функция вторым параметром требует символ, который искать и может быть использована для поиска ЛЮБЫХ одиночных символов в строке
пишите в любую ячейку =SingleCharCnt(a2;"/"), получите 7
соотв. =SingleCharCnt(a3;"/") будет 2
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо Большое!
 
Решил добавить сюда решение, если нужно вытащить только группу символов без остального мусора. Код:
Код
Function RegexExecuteSlash(s$)
Dim re, ms, m, i, v$
Dim str As String
Set re = CreateObject("VBScript.RegExp"): re.Global = True
re.Pattern = "(?:^|[^/])(/)(?=[^/]|$)"
If re.test(s) Then
    For Each i In re.Execute(s)
       str = str & "" & i.submatches.Item(0) ' сцепить str с первой группой
    Next i
End If
RegexExecuteSlash = str
End Function

Код выше предназначен для извлечения одиночных слешей из строки.
Еще раз Большое спасибо Всем откликнувшимся! :)
Изменено: artemkau88 - 07.12.2023 15:55:24
 
чуть проще, вроде тож работает )
Код
(?:^|[^/])(/)(?!\/)
Изменено: nilske - 07.12.2023 16:37:42
 
nilske, спасибо и Вам. :)  
Страницы: 1
Наверх