Я пытался удалить однострочные комментарии из файлов JavaScript, используя следующее регулярное выражение:

Pattern p = Pattern.compile("(?m)(?:[\\(|\\)|;|\\}|\\{])\\s*/{2}(.*?)$");

Шаблон работает, когда я тестирую его в чем-то вроде RegexPal, используя параметр "^$ соответствует разрыву строки" в каком-то образце исходного кода JavaScript. .

Однако при добавлении его в мою программу на Java проблема заключается в том, что флаг «m» работает неправильно. По сути, даже несмотря на то, что я указываю флаг с помощью «(?m)» в начале шаблона (хотя я также пытался использовать Pattern.MULTILINE), кажется, что он полностью игнорирует его, что делает мой $ соответствует всему документу до конца, а не только EOL.

2
jerluc 7 Апр 2011 в 23:07
Похоже, вы забыли включить '^' в регулярное выражение, поэтому оно просто сопоставляет $ с окончательным EOL.
 – 
jberg
7 Апр 2011 в 23:23
Я не пытаюсь сопоставить что-либо в начале строки.
 – 
jerluc
7 Апр 2011 в 23:30
1
Было бы полезно, если бы вы могли показать код. Вы работаете со всем файлом как с куском или читаете его построчно в цикле и обрабатываете каждую строку? Вы используете matches() или find()? Кроме того, что хорошего в том, чтобы сопоставлять комментарии, когда вы на самом деле пытаетесь их удалить? т. е. вы пытаетесь убить их, чтобы уменьшить размер исходного кода, или извлечь их, чтобы просмотреть или распечатать?
 – 
Carl Smotricz
7 Апр 2011 в 23:47
Я чувствую себя таким глупым сейчас. Я читаю файл построчно в StringBuilder, но я никогда не добавляю новую строку в конце! Спасибо, Карл, что обратил мое внимание на эту идею!
 – 
jerluc
7 Апр 2011 в 23:59

1 ответ

Работает для меня:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MultilinePattern {

   public static void main( String[] args ) {
      Pattern p = Pattern.compile("(?m)(?:[\\(|\\)|;|\\}|\\{])\\s*/{2}(.*?)$");
      String multilineJS = "var i = 1; // this is the first comment\n" + //
         " i++; // this is the second comment\n" + //
         " alert(i);";
      Matcher matcher = p.matcher(multilineJS);
      while ( matcher.find() ) {
         System.out.println(matcher.group(1));
      }
   }
}

Этот фрагмент дает:

this is the first comment
this is the second comment

Как насчет разрывов строк в строке, которую вы используете для проверки шаблона: они верны для вашей ОС? Вы уверены, что они вообще есть в вашей строке?

1
the.duckman 7 Апр 2011 в 23:39
Да, регулярное выражение достаточно хорошо для этого, но внезапно, если у вас есть var url = 'http://www.google.com';, вы SOL. Таким образом, идея заключалась в том, чтобы использовать ложный возврат для соответствия //, который идет только после определенных символов, таких как ;, } и т. д.
 – 
jerluc
7 Апр 2011 в 23:43
Действительно? Мой фрагмент (и, следовательно, ваш шаблон) также работает с вашей строкой. Поскольку вы это знаете, обновите свой вопрос, чтобы показать, что не работает.
 – 
the.duckman
8 Апр 2011 в 00:58