Извлеките подстроку из пути. Убедитесь, что за извлеченной подстрокой не следует символ

#regex #string #path #applescript

#регулярное выражение #строка #путь #applescript

Вопрос:

Допустим, у меня есть эта строка:

 /folder1/folder2/match/folder3/match.app
  

Я хочу извлечь подстроку, которая заканчивается условием соответствия (« match «), но за которой не следует определенный символ (« . «)

Результат должен быть:

 /folder1/folder2/match
  

Случай 1

В случае « match. » перед « match «, за которым следует любой другой символ или нет:

 /folder1/folder2/match.app/folder3/match/folder4
  

Результат должен быть:

 /folder1/folder2/match.app/folder3/match
  

Поскольку за первым « match » следует « . »


Случай 2

В случае двух совпадений:

 /folder1/folder2/match/folder3/match/folder4
  

Результат должен быть:

  /folder1/folder2/match
  

Я хочу сохранить только первую подстроку.


Случай 3

В случае, если нет никакого « match » без следующего « . «:

 /folder1/folder2/match.app
  

Результат должен быть:

 False
  

Регулярное выражение должно выводить « False «, когда нет вхождений.


Случай 4

В случае, если за « match » следует любой другой символ, кроме « / » или «ничего больше» :

 /folder1/folder2/matcha/match/folder3
  

или

 /folder1/folder2/matcha/match
  

Результат должен быть:

  /folder1/folder2/matcha/match
  

Есть идеи? Спасибо!


ПРИМЕЧАНИЕ: я хочу использовать это регулярное выражение в Applescript:

 set strRegEx to ???
set strResult to find text strRegEx in strTextToSearch with regexp and string result
  

ОБНОВЛЕНИЕ: добавлен случай 4

Комментарии:

1. где вы хотите разместить рекламный код, есть ли какой-либо javascript или .htaccess или любой языковой файл?

2. В applescript: установите strResult для поиска текстового strRegEx в strTextToSearch с регулярным выражением и строковым результатом

3. /(?<=/match)(?!.)(.*)/ следует сделать это в php PCRE. Я не уверен, какой движок используется в applescript.

4. Как я могу получить «False», если совпадения нет?

5. Приведенные ниже ответы все они хорошо интерпретируются applescript (за исключением «экранирующего» символа «\», а не просто «»)

Ответ №1:

Вот одно из решений:

 .*?match(?!.)
  

Демонстрация (Примечание: ^ в этой демонстрации добавлено только для совместного показа нескольких примеров; вам это не понадобится.)

Объяснение:

. — соответствует любому символу

*? — повторяет предыдущий шаблон столько раз, сколько необходимо, но как можно меньше («нежадный»).

match — буквенный текст для слова «совпадение»

(?!...) отрицательный прогноз; содержащийся шаблон не включен в результат и не может быть сопоставлен.

. литерал «.» ( предотвращает его обработку как «любого символа», как указано выше)


Редактировать:

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

 .*?match(?=/|$)
  

ДЕМОНСТРАЦИЯ

Объяснение:

(?=...) это положительный прогноз.

/ соответствует буквальному символу «/».

$ соответствует концу строки.

/|$ соответствует любому из приведенных выше.

Комментарии:

1. Почти идеально! Я забыл условие. Обновил мой вопрос. Кроме того, могу ли я получить пользовательский вывод («False») всякий раз, когда нет никаких результатов?

2. Я обновил свой ответ для «случая 4». Я не совсем уверен, чего вы пытаетесь достичь с помощью этой "False" переменной; мне нужно было бы знать немного больше контекста того, как вы ее используете… Я также никогда раньше не использовал applescript, поэтому у кого-то еще может быть идея получше меня 🙂

3. Теперь это действительно идеально! О «False».. Я думал, что смогу вывести пользовательский текст, если условие было или не было выполнено без if ..else в моем коде applescript 🙂

4. Что strResult в настоящее время равно в вашем коде, когда это происходит? NULL или аналогично? (Как я уже сказал, я не знаю applescript …) — Не могли бы вы просто сделать что-то вроде if strResult == NULL .... уже?

5. Это именно то, что я сделаю. Что ж, большое спасибо за все! Вы получили это!

Ответ №2:

В большинстве случаев достаточно первого совпадения в строке с регулярным выражением (^.*?match(?!.)) regex.

Проверьте это наRegex101.com

  • /folder1/folder2/match/folder3/match.app Матчи /folder1/folder2/match
  • /folder1/folder2/match.app/folder3/match/folder4 Матчи /folder1/folder2/match.app/folder3/match
  • /folder1/folder2/match/folder3/match/folder4 соответствует обоим:
    • /folder1/folder2/match
    • /folder3/match
  • /folder1/folder2/match.app ничему не соответствует.

Не могли бы вы рассмотреть возможность использования определенного регулярного выражения для каждого случая?

Редактировать. Если вы используете gm параметры и добавляете ^ в начало регулярного выражения, вы можете получить правильную часть строки в качестве единственного совпадения.

Ответ №3:

Я думаю, вы ищете что-то вроде этого.

 .*?match[^.]
  

разбивка
. все символы
*? 0 до бесконечности, но не жадный
match совпадение слов
[^ не следует следующий список
. точка ( — это экранирование ее для чтения как точка, а не как все символы.
] конец списка

если вы читаете только первое найденное совпадение, вы получаете для вашего случая 2 только первое совпадение. если вы прочитаете все совпадения, вы также получите folder3/match в результате

и в случае 3 совпадение не найдено

Комментарии:

1. Кажется, это почти достигнуто. Однако я получаю дополнительный «/» в конце подстроки. Кроме того, могу ли я заставить его просто указать мне первое вхождение (в случае 2). И могу ли я получить пользовательский вывод («False») всякий раз, когда нет никаких результатов?

2. если оно всегда находится в начале строки, вы можете использовать это ^.*?match(?!.) , то ^ впереди указывает его в начале строки. чтобы не иметь точки, вам нужен отрицательный прогноз. ДЕМОНСТРАЦИЯ