#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(?!.)
, то ^ впереди указывает его в начале строки. чтобы не иметь точки, вам нужен отрицательный прогноз. ДЕМОНСТРАЦИЯ