Подтвердить что ты не робот

Как получить строку между двумя символами?

У меня есть строка,

String s = "test string (67)";

Я хочу получить no 67, который является строкой между (и).

Может кто-нибудь скажет мне, как это сделать?

4b9b3361

Ответ 1

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

String s = "test string (67)";

s = s.substring(s.indexOf("(") + 1);
s = s.substring(0, s.indexOf(")"));

System.out.println(s);

Ответ 2

Попробуй так:

String s="test string(67)";
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

Сигнатура метода для подстроки:

s.substring(int start, int end);

Ответ 3

Очень полезное решение этой проблемы, не требующее от вас делать indexOf, - это использовать библиотеки Apache Commons.

 StringUtils.substringBetween(s, "(", ")");

Этот метод позволит вам даже обрабатывать, даже если есть несколько вхождений замыкающей строки, которые не будут легкими, если искать закрывающую строку indexOf.

Вы можете скачать эту библиотеку здесь: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Ответ 4

Используя регулярное выражение:

 String s = "test string (67)";
 Pattern p = Pattern.compile("\\(.*?\\)");
 Matcher m = p.matcher(s);
 if(m.find())
    System.out.println(m.group().subSequence(1, m.group().length()-1)); 

Ответ 5

Java поддерживает регулярные выражения, но они довольно громоздки, если вы действительно хотите использовать их для извлечения совпадений. Я думаю, что самый простой способ получить нужную строку в вашем примере - просто использовать поддержку регулярного выражения в методе String class replaceAll:

String x = "test string (67)".replaceAll(".*\\(|\\).*", "");
// x is now the String "67"

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

Однако результатом этого является String. Если вам нужен целочисленный результат, тогда вам нужно сделать другое преобразование:

int n = Integer.parseInt(x);
// n is now the integer 67

Ответ 6

В одной строке я предлагаю:

String input = "test string (67)";
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")"));
System.out.println(input);`

Ответ 7

String s = "test string (67)";

int start = 0; // '(' position in string
int end = 0; // ')' position in string
for(int i = 0; i < s.length(); i++) { 
    if(s.charAt(i) == '(') // Looking for '(' position in string
       start = i;
    else if(s.charAt(i) == ')') // Looking for ')' position in  string
       end = i;
}
String number = s.substring(start+1, end); // you take value between start and end

Ответ 8

Для этого вы можете использовать общую библиотеку Apache StringUtils.

import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....

Ответ 9

String result = s.substring(s.indexOf("(") + 1, s.indexOf(")"));

Ответ 10

Другой способ использования метода split

public static void main(String[] args) {


    String s = "test string (67)";
    String[] ss;
    ss= s.split("\\(");
    ss = ss[1].split("\\)");

    System.out.println(ss[0]);
}

Ответ 11

Используйте Pattern and Matcher

public class Chk {

    public static void main(String[] args) {

        String s = "test string (67)";
        ArrayList<String> arL = new ArrayList<String>();
        ArrayList<String> inL = new ArrayList<String>();

        Pattern pat = Pattern.compile("\\(\\w+\\)");
        Matcher mat = pat.matcher(s);

        while (mat.find()) {

            arL.add(mat.group());
            System.out.println(mat.group());

        }

        for (String sx : arL) {

            Pattern p = Pattern.compile("(\\w+)");
            Matcher m = p.matcher(sx);

            while (m.find()) {

                inL.add(m.group());
                System.out.println(m.group());
            }
        }

        System.out.println(inL);

    }

}

Ответ 12

Наименее общий способ, который я нашел, чтобы сделать это с помощью классов Regex и Pattern/Matcher:

String text = "test string (67)";

String START = "\\(";  // A literal "(" character in regex
String END   = "\\)";  // A literal ")" character in regex

// Captures the word(s) between the above two character(s)
String pattern = START + "(\w+)" + END;

Pattern pattern = Pattern.compile(pattern);
Matcher matcher = pattern.matcher(text);

while(matcher.find()) {
    System.out.println(matcher.group()
        .replace(START, "").replace(END, ""));
}

Это может помочь для более сложных проблем с регулярным выражением, где вы хотите получить текст между двумя наборами символов.

Ответ 13

String s = "test string (67)";

System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")")));

Ответ 14

Другим возможным решением является использование lastIndexOf, где он будет искать символ или строку из обратного.

В моем сценарии у меня было следующее String, и мне пришлось извлечь <<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc

Итак, indexOf и StringUtils.substringBetween не помогли, так как они начали искать символ с начала.

Итак, я использовал lastIndexOf

String str = "1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc";
String userName = str.substring(str.lastIndexOf("_") + 1, str.lastIndexOf("."));

И это дает мне

<<UserName>>

Ответ 15

public String getStringBetweenTwoChars(String input, String startChar, String endChar) {
    try {
        int start = input.indexOf(startChar);
        if (start != -1) {
            int end = input.indexOf(endChar, start + startChar.length());
            if (end != -1) {
                return input.substring(start + startChar.length(), end);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return input; // return null; || return "" ;
}

Использование:

String s = "test string (67)";
String output = getStringBetweenTwoChars(s, "(", ")");
System.out.println(output);
// Output: "67"

Ответ 16

"Общий" способ сделать это - разобрать строку с самого начала, выбросив все символы перед первой скобкой, записать символы после первой скобки и выбросить символы после второй скобки.

Я уверен, что есть библиотека регулярных выражений или что-то в этом роде.

Ответ 17

Что-то вроде этого:

public static String innerSubString(String txt, char prefix, char suffix) {

    if(txt != null && txt.length() > 1) {

        int start = 0, end = 0;
        char token;
        for(int i = 0; i < txt.length(); i++) {
            token = txt.charAt(i);
            if(token == prefix)
                start = i;
            else if(token == suffix)
                end = i;
        }

        if(start + 1 < end)
            return txt.substring(start+1, end);

    }

    return null;
}

Ответ 18

Я получил такой ответ. Попробуйте

String value = "test string (67)";
int intValue =Integer.valueOf( value.replaceAll("[^0-9]", ""));