108

私はひもを持っています、

String s = "test string (67)";

( と ) の間の文字列である no 67 を取得したい。

誰でもこれを行う方法を教えてもらえますか?

4

22 に答える 22

117

おそらく本当にきちんとした RegExp がありますが、私はその分野では初心者なので、代わりに...

String s = "test string (67)";

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

System.out.println(s);
于 2012-09-26T05:27:44.150 に答える
101

indexOf を実行する必要のないこの問題の非常に便利な解決策は、Apache Commonsライブラリを使用することです。

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

このメソッドを使用すると、終了文字列が複数回出現する場合でも処理できます。これは、indexOf 終了文字列を探すだけでは簡単ではありません。

このライブラリは、 https ://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4 からダウンロードできます。

于 2016-07-07T06:28:47.670 に答える
80

このようにしてみてください

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

部分文字列のメソッドのシグネチャは次のとおりです。

s.substring(int start, int end);
于 2013-08-07T06:42:21.570 に答える
31

正規表現を使用して:

 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)); 
于 2012-09-26T05:48:18.527 に答える
19

Java は正規表現をサポートしていますが、実際に正規表現を使用して一致を抽出したい場合は、やや面倒です。String例で必要な文字列を取得する最も簡単な方法は、クラスの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
于 2012-09-26T05:37:21.580 に答える
8

これを行うには、Apache 共通ライブラリの StringUtils を使用できます。

import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....
于 2016-04-11T19:04:07.003 に答える
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
于 2012-09-26T05:30:31.590 に答える
5
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 input = "test string (67)";
String startChar = "(";
String endChar   = ")";
String output = getStringBetweenTwoChars(input, startChar, endChar);
System.out.println(output);
// Output: "67"
于 2018-10-27T17:21:56.200 に答える
4

使用する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);

    }

}
于 2012-09-26T05:56:26.287 に答える
4

分割方法を使用する別の方法

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]);
}
于 2012-09-26T05:36:59.157 に答える
3

正規表現とパターン/マッチャークラスでこれを行うために私が見つけた最も一般的な方法:

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, ""));
}

これは、2 つの文字セットの間のテキストを取得する必要がある、より複雑な正規表現の問題に役立つ場合があります。

于 2017-02-02T19:25:12.263 に答える
3

もう 1 つの考えられる解決策は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>>
于 2017-10-05T18:49:55.247 に答える
2

これを行う「一般的な」方法は、文字列を最初から解析し、最初の括弧の前のすべての文字を破棄し、最初の括弧の後の文字を記録し、2 番目の括弧の後の文字を破棄することです。

ただし、正規表現ライブラリまたはそれを行うための何かがあると確信しています。

于 2012-09-26T05:26:22.460 に答える
2
String s = "test string (67)";

System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")")));
于 2016-02-18T11:50:04.147 に答える
0
String s = "(69)";
System.out.println(s.substring(s.lastIndexOf('(')+1,s.lastIndexOf(')')));
于 2021-04-29T15:43:04.483 に答える