Найти последний индекс по Regex в Java - PullRequest
10 голосов
/ 01 апреля 2010

у меня есть строка %/O^/O%/O. Я хочу найти последний / разделить строку. Первая попытка была: \/[POL]$, но это включает в себя "O", что очевидно. У кого-нибудь есть совет?

Ответы [ 7 ]

10 голосов
/ 12 июня 2012

Я согласен, что использование стандартного метода String.lastIndexOf () - ваш лучший способ действий, но я недавно использовал для части Regex (а именно, я хотел найти последний не буквенно-цифровой символ в строке).

Я закончил писать сам и думал поделиться, в надежде, что это поможет другим:

/**
 * Indicates that a String search operation yielded no results.
 */
public static final int NOT_FOUND = -1;

/**
 * Version of lastIndexOf that uses regular expressions for searching.
 * By Tomer Godinger.
 * 
 * @param str String in which to search for the pattern.
 * @param toFind Pattern to locate.
 * @return The index of the requested pattern, if found; NOT_FOUND (-1) otherwise.
 */
public static int lastIndexOfRegex(String str, String toFind)
{
    Pattern pattern = Pattern.compile(toFind);
    Matcher matcher = pattern.matcher(str);

    // Default to the NOT_FOUND constant
    int lastIndex = NOT_FOUND;

    // Search for the given pattern
    while (matcher.find())
    {
        lastIndex = matcher.start();
    }

    return lastIndex;
}

/**
 * Finds the last index of the given regular expression pattern in the given string,
 * starting from the given index (and conceptually going backwards).
 * By Tomer Godinger.
 * 
 * @param str String in which to search for the pattern.
 * @param toFind Pattern to locate.
 * @param fromIndex Maximum allowed index.
 * @return The index of the requested pattern, if found; NOT_FOUND (-1) otherwise.
 */
public static int lastIndexOfRegex(String str, String toFind, int fromIndex)
{
    // Limit the search by searching on a suitable substring
    return lastIndexOfRegex(str.substring(0, fromIndex), toFind);
}

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

Но чтобы сделать это, вам также придется изменить схему; это может быть просто в некоторых случаях (например, мой случай поиска одного символа), но может оказаться проблематичным в других.

10 голосов
/ 01 апреля 2010
/(?=[^/]*$)

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

String[] splitArray = subjectString.split("/(?=[^/]*$)");
4 голосов
/ 16 мая 2012

Основной вопрос хорош, хотя приведенный вами пример не нужно это. IndexOf Java не принимает регулярные выражения. Ответ просто предметная часть вопроса, вот что вам нужно:

/**
* Version of indexOf that uses regular expressions for the search
* by Julian Cochran.
*/
public static int indexOfRegex(String message, String toFind) {
  // Need to add an extra character to message because to ensure
  // split works if toFind is right at the end of the message.
  message = message + " ";
  String separated[] = message.split(toFind);
  if (separated == null ||
      separated.length == 0 ||
      separated.length == 1) {
    return -1;
  }
  return separated[0].length();
}

Если вам нужен последний индекс:

/**
* Version of lastIndexOf that uses regular expressions for
* the search by Julian Cochran.
*/
public static int lastIndexOfRegex(String message, String toFind) {
  // Need to add an extra character to message because to ensure
  // split works if toFind is right at the end of the message.
  message = message + " ";
  String separated[] = message.split(toFind);
  if (separated == null ||
      separated.length == 0 ||
      separated.length == 1) {
    return -1;
  }
  return separated[separated.length - 1].length();
}
4 голосов
/ 01 апреля 2010

Вам нужно использовать регулярные выражения для этого? Будет ли работать String. lastIndexOf ("/") для поиска индекса, а затем использовать String.substring (int start, int end) с результатом? Или ваши фактические данные отличаются и являются более сложными, требующими регулярных выражений? С тем, что вы предоставили, чтобы разбить строку на последний /, вот код:

int lastSlash = mystring.lastIndexOf("/");
String start = mystring.substring(0, lastSlash);
String end = mystring.substring(lastSlash + 1, mystring.length);
2 голосов
/ 01 апреля 2010

Если все, что вам нужно, это найти последний экземпляр регулярного выражения персонажа излишним, вам просто нужно использовать String's lastIndexOf

int pos = myString.lastIndexOf('/');
0 голосов
/ 29 июня 2017

ref: https://github.com/apache/commons-lang/pull/273/files

<code>   public static int lastIndexOfAnyChar( final CharSequence str,final String searchChars) {
    return searchChars == null ? INDEX_NOT_FOUND : lastIndexOfAnyChar(str,searchChars.toCharArray());
}

/**
 * <p>Search a CharSequence to find the last index of any
 * character in the given set of characters.</p>
 *
 * <p>A {@code null} String will return {@code -1}.
 * A {@code null} or zero length search array will return {@code -1}.</p>
 *
 * <pre>
 * StringUtils.lastIndexOfAnyChar(null, *)                = -1
 * StringUtils.lastIndexOfAnyChar("", *)                  = -1
 * StringUtils.lastIndexOfAnyChar(*, null)                = -1
 * StringUtils.lastIndexOfAnyChar(*, [])                  = -1
 * StringUtils.lastIndexOfAnyChar("zzabyycdxx",['z','a']) = 2
 * StringUtils.lastIndexOfAnyChar("zzabyycdxx",['b','y']) = 5
 * StringUtils.lastIndexOfAnyChar("aba", ['z'])           = -1
 * 
* * @param cs CharSequence для проверки, может быть нулевым * @param searchChars символов для поиска, может быть нулевым * @ возвращают последний индекс любого из символов, -1, если нет совпадения или нулевой ввод * / public static int lastIndexOfAnyChar (конечная строка CharSequence, конечная строка char ... searchChars) { if (isEmpty (str) || ArrayUtils.isEmpty (searchChars)) { return INDEX_NOT_FOUND; } int csLen = str.length (); int csLast = csLen - 1; int searchLen = searchChars.length; int searchLast = searchLen - 1; for (int i = csLast; i> = 0; i--) { char ch = str.charAt (i); for (int j = 0; j
0 голосов
/ 21 июня 2013
        String name ="rami is good boy, and he is working for andorid,is completed";
    int lastSlash = name.lastIndexOf("is");
    String start = name.substring(0, lastSlash);
    String end = name.substring(lastSlash + 1, name.length());
    StringBuffer sb = new StringBuffer(name);
    sb.replace(start.length(), name.lastIndexOf(end)+1, "");

    System.out.println(sb.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...