Сопоставление регулярных выражений Java с src = "abc" или src = 'abc' - PullRequest
2 голосов
/ 19 января 2012

Я в строгой среде Java.

Так что вопрос на самом деле не такой простой, как в статье, я не пытаюсь решить возникшую у меня проблему, он более теоретический для лучшего знания.

Что меня интересует, так этосопоставление с src двойной или простой кавычкой, но если это двойная кавычка, ее также необходимо закрыть двойной кавычкой, и то же относится и к простой кавычке.

Я знаю, что могу повторитьсамо по себе регулярное выражение, то есть:

String str = "src=\"hello/\" ... src='hello/' ..."

println str.replaceAll ("src=((\"[^\"]+\")|('[^']+'))", "src=$1")

Я хотел бы сделать следующее:

println s.replaceAll ("src=([\"'][^\"']+[\"'])", "src=$1")

Однако, если он начинается с двойной кавычки, то в кавычках должны быть разрешенысодержание, и оно должно заканчиваться двойной кавычкой, а не простой цитатой.

Вопрос 2:

Можно ли заменить его на все найденные цитаты того же типа?Можно ли сказать, что для этого совпадения заменить на this2, для этого заменить на that2.Как вы можете сделать это, не генерируя новую строку каждый раз?

Правка для Алана Мора, пример для второго вопроса:

println "one ... two".replaceAll( "(one)", "1" ).replaceAll("(two)", "2");

больше по этим строкам (не верно)

println "one ... two".replaceMyMatches( "(one)[^\\w]+(two)", "\$1{1}, \$2{2}" ) // prints string : one{1}, two{2} 

Мне нужна строка: 1, 2

Ответ на первый вопрос, полученный и измененный немного от черной панды и Джеффа Уокера:

String str = "src=\"1.png\" ... src='2.jpeg' ... src=\"3.p'ng\" ... src='4.jpe\"g' ... src='' ... src=\"\" ..." ;

String regex = "src=(['\"])(.+?)\\1"; // closes with the quote that is in group 1

println str.replaceAll( regex, '''src=$1../new_path/$2$1''')

Выплевывает:

src="../new_path/1.png" ... src='../new_path/2.jpeg' ... src="../new_path/3.p'ng" ... src='../new_path/4.jpe"g' ... src='' ... src="" ...

Если кто-то тоже хочет заменить пустые, просто переключите + в регулярном выражении против звезды (я этого не хочу)

Обратите вниманиеоригинальные цитаты также есть.

Ответьте на вопрос два см. черная панда

Ответы [ 4 ]

2 голосов
/ 19 января 2012

Мой ответ на вопрос 1 изначально был неверным.Вот обновленная версия.

Чтобы ответить на вопрос 1.. Посмотрите, поможет ли вам это регулярное выражение: Шаблон:

src=(['"])(.*?)\1

Код ниже объясняет каждый фрагмент.

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

public class Regex {

   public static void main(String[] args)
   {
      final String regex = "src=(['\"])" // the ' or the " is in group 1
              + "(.*?)" // match any character in a non-greedy fashion
              + "\\1"; // closes with the quote that is in group 1
      Pattern p = Pattern.compile(regex);

      Matcher m = p.matcher("src=\"hello/\"  ...   src='goodbye/'  ... "
              + "src='this has a \" in it'");

      while (m.find())
      {
         System.out.println("\nfound!");
         System.out.println("The quote was a " + m.group(1));
         System.out.println("the text was = " + m.group(2));
      }
   }
}

Это дает вывод:

found!
The quote was a "
the text was = hello/

found!
The quote was a '
the text was = goodbye/

found!
The quote was a '
the text was = this has a " in it

Что касается второго вопроса, вам придется использовать немного больше кода, чем этот.Вы создаете свой собственный StringBuffer и добавляете его по мере продвижения.Я использовал карту для хранения замен:

   public static void question2()
   {
      Pattern p = Pattern.compile("one|two");
      Map<String, String> replacements = new HashMap<String, String>();

      replacements.put("one", "1");
      replacements.put("two", "2");

      StringBuffer result = new StringBuffer();

      String text = "one ... two";

      Matcher m = p.matcher(text);

      while (m.find())
      {
         m.appendReplacement(result, replacements.get(m.group()));
      }

      m.appendTail(result);

      System.out.println(result.toString());

   }

Это выводит:

1 ... 2
2 голосов
/ 19 января 2012

Регулярное выражение для вопроса 1:

src=(['"])hello\1 (двойной обратный слеш для строки Java)

Соответствует первой или двойной кавычке, а затем тому же символу, что и первая кавычка, используя обратную ссылку.

Так что для более общего случая мне нравится:

^src=(['"])(.*?)\1$

Тогда замена может быть чем-то вроде:

String regex = "^src=(['\"])(.*?)\\1$";
String newthing = "src=$2";

Эточто ты хочешь?В основном, чтобы удалить кавычки, заставляя их совпадать?

Из-за проницательного комментария я теперь понимаю, что вы хотите, чтобы кавычки уходили друг от друга.Такие языки, как Perl, делают это, но они не анализируются с помощью регулярных выражений.Этот тип вещи относится к классу проблем, которые требуют фактического анализа.(не могу вспомнить фактический термин)

Вместо замены вам придется проверить группу 2 и «утверждать», что группа 1 не существует.Заметил, что я добавил начальные и конечные якоря в регулярное выражение.

Так что-то вроде:

Pattern p = Pattern.compile("^src=(['\"])(.*?)\\1$");
Matcher m = p.matcher("src=\"what's up?\"");
if ( m.matches() ) {
    if ( m.group(2).contains(m.group(1)) ) {
        // fail, doesn't match
    }
}
// success, follows all of the rules

У меня проблемы с пониманием того, что вы ищете во втором вопросе, даже сОбновить.Я отредактирую этот ответ, если получу его.

1 голос
/ 19 января 2012

Вы можете попробовать что-то вроде этого

String str = "src=\"hello/\" ... src='hello/' ...";

System.out.println(str.replaceAll("src=([\"'])(.*?)\\1", "src='$2'"));

Хитрость заключается в том, чтобы повторно использовать первый соответствующий шаблон, используя \ 1 в том же регулярном выражении

0 голосов
/ 19 января 2012

Для первого вопроса вы можете использовать это регулярное выражение:

"([\"'])(?:(?!\\1).)*\\1"

Вторая часть не имеет чистого решения регулярных выражений - по крайней мере, не в Java. См. этот ответ о способе Java. Так, например, если у вас была такая таблица:

{ "one" => "1", "two" => "2" }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...