Подстановка строки Java из подстроки [дубликат]

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

Это то, что я получаю на своей машине, вместе с тем, что я думаю, что происходит:

$ cat evil.c
void evil(){
  int i = 0;
  i+= i++ + ++i;
}
$ gcc evil.c -c -o evil.bin
$ gdb evil.bin
(gdb) disassemble evil
Dump of assembler code for function evil:
   0x00000000 <+0>:   push   %ebp
   0x00000001 <+1>:   mov    %esp,%ebp
   0x00000003 <+3>:   sub    $0x10,%esp
   0x00000006 <+6>:   movl   $0x0,-0x4(%ebp)  // i = 0   i = 0
   0x0000000d <+13>:  addl   $0x1,-0x4(%ebp)  // i++     i = 1
   0x00000011 <+17>:  mov    -0x4(%ebp),%eax  // j = i   i = 1  j = 1
   0x00000014 <+20>:  add    %eax,%eax        // j += j  i = 1  j = 2
   0x00000016 <+22>:  add    %eax,-0x4(%ebp)  // i += j  i = 3
   0x00000019 <+25>:  addl   $0x1,-0x4(%ebp)  // i++     i = 4
   0x0000001d <+29>:  leave  
   0x0000001e <+30>:  ret
End of assembler dump.

(I ... предположим, что команда 0x00000014 была какой-то оптимизацией компилятора?)

24
задан Tien Nguyen 16 May 2013 в 21:55
поделиться

4 ответа

Ваша картина в порядке. Но вы не должны быть split() отброшены, вы должны find() это. Следующий код дает результат, который вы ищете:

String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>";
Pattern pattern = Pattern.compile("<%=(.*?)%>");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}
49
ответ дан Wasi Ahmad 22 August 2018 в 01:54
поделиться

Я ответил на этот вопрос здесь: https://stackoverflow.com/a/38238785/1773972

В основном используется

StringUtils.substringBetween(str, "<%=", "%>");

Это requirs с использованием библиотеки «Apache commons lang»: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

В этой библиотеке много полезные методы для работы со строкой, вам действительно удастся изучить эту библиотеку в других областях вашего Java-кода !!!

20
ответ дан Community 22 August 2018 в 01:54
поделиться

Ваше регулярное выражение выглядит правильно, но вы splitting вместе с ним вместо matching. Вы хотите что-то вроде этого:

// Untested code
Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group());
}
3
ответ дан Henry Keiter 22 August 2018 в 01:54
поделиться

Подход Jlordo охватывает конкретную ситуацию. Если вы попытаетесь создать из него абстрактный метод, вы можете столкнуться с трудностями, чтобы проверить, есть ли «textFrom» до «textTo». В противном случае метод может возвращать совпадение для другого события «textFrom» в тексте.

Вот готовый абстрактный метод, который покрывает этот недостаток:

  /**
   * Get text between two strings. Passed limiting strings are not 
   * included into result.
   *
   * @param text     Text to search in.
   * @param textFrom Text to start cutting from (exclusive).
   * @param textTo   Text to stop cuutting at (exclusive).
   */
  public static String getBetweenStrings(
    String text,
    String textFrom,
    String textTo) {

    String result = "";

    // Cut the beginning of the text to not occasionally meet a      
    // 'textTo' value in it:
    result =
      text.substring(
        text.indexOf(textFrom) + textFrom.length(),
        text.length());

    // Cut the excessive ending of the text:
    result =
      result.substring(
        0,
        result.indexOf(textTo));

    return result;
  }
1
ответ дан Zon 22 August 2018 в 01:54
поделиться
  • 1
    Это не будет возвращать несколько случаев, если имеется несколько совпадений. Только первый. – Wheel Builder 8 May 2018 в 17:21
Другие вопросы по тегам:

Похожие вопросы: