Я хочу просто вытащить какой-то цитируемый текст из вызова функции и задавался вопросом, могу ли я получить некоторую помощь с регулярным выражением?
Строка будет выглядеть примерно так: «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 будет строкой в кавычках. Вы должны будете снова зачислить его сами.
(это не очень научно, так как в нем, вероятно, найдутся некоторые вещи, которые вы не хотите)