Я хочу просто вытащить какой-то цитируемый текст из вызова функции и задавался вопросом, могу ли я получить некоторую помощь с регулярным выражением?
Строка будет выглядеть примерно так: «MyFunction (« MyStringArg »);
Я, по сути, хотел бы сканировать файл для любых строк, которые вызывают «MyFunction», а затем фиксирует строковый литерал внутри кавычек.
Последующий вопрос
Как я могу избежать комментариев с этим?
Обновить
Я смог решить свою проблему:
MyFunction\s*\(\s*"(.*?)\"\s*\)\s*;
Спасибо @devyndraen и всем за вашу помощь!
Я не уверен, какие требования к форматированию у вас есть, поэтому я включил в себя предположение, что в нормальных местах программирования может быть какое-то место в пространстве.
Полученная строка будет в \ 1 обратном направлении.
MyFunction\s*\(\s*"(.*?)\"\s*\)\s*;
Я бы предложил это не-жадное регулярное выражение с флагом s
(DOTALL в Java) (если в круглой скобке этого вызова функции нет комментариев:
$regex = '/MyFunction.*?\(.*?"(.*?)".*?\).*?;/s';
Если вы используете preg_match($regex, $str, $matches)
то аргумент будет доступен в $matches[1]
.
Чтобы компенсировать прокомментированные строки или блоки, сначала нужно отфильтровать файл, чтобы удалить все комментарии перед применением регулярного выражения. Для PHP вы можете использовать следующее:
$example=' line 1 line 2 // comment 1 line 3 # comment 2 // comment 3.1 # comment 3.2 /* comment 4.1 comment 4.2 */ line 9 /* comment 5.1 comment 5.2 */'; echo '<h3>Example Text</h3><pre>'.$example.'</pre><hr>'; $regex='/ (?x) (?: # single-line inline comments beginning at col#1 (?s) (?:\\/\\/|\\#) [^\\n]+ \\n | # single-line inline comments beginning after col#1 # preserve leading content (?m) ^ (.+?) (?:\\/\\/|\\#) .*? $ | # multi-line comments (?s) \\/ \\* (?:.|\\n)*? \\* \\/ ) /x'; echo '<h3>Regular Expression</h3><pre>'.$regex.'</pre><hr>'; $result=preg_replace( $regex, '$1', $example); echo '<h3>Result</h3><pre>'.$result.'</pre><hr>';
который производит:
линия 1 строка 2 // комментарий 1 строка 3 # комментарий 2 // комментарий 3.1 # комментарий 3.2 / * комментарий 4.1 комментарий 4.2 * / строка 9 / * комментарий 5.1 комментарий 5.2 * /
/ (?Икс) (?: # однострочные строчные комментарии, начинающиеся с col # 1 (? S) (?: \ / \ / | \ #) [^ \ П] + \ п | # однострочные строчные комментарии, начинающиеся после col # 1 # сохранить ведущий контент (? М) ^ (. +?) (?: \ / \ / | \ #) . *? $ | # многострочные комментарии (? S) \ / \ * (?: |. \ П) *? \ * \ / ) /Икс
линия 1 строка 2 строка 3 строка 9
[^(]*("([^"]*)")
а затем группа номер 1 будет строкой в кавычках. Вы должны будете снова зачислить его сами.
(это не очень научно, так как в нем, вероятно, найдутся некоторые вещи, которые вы не хотите)