2文字の間に文字列を取得するにはどうすればよいですか?


93

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

String s = "test string (67)";

(と)の間の文字列である67番を取得したいと思います。

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


1
いくつかの方法があります-あなたが到達するまでの文字列に文字を反復することができ(、または最初のインデックスを見つける()、ほとんどの人はどうなるのか、サブストリングまたはでそれを行う、正規表現を使用します。
アンドレアスドルク2012

回答:


102

おそらく本当に素晴らしい正規表現がありますが、私はその分野では初心者なので、代わりに...

String s = "test string (67)";

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

System.out.println(s);

4
正規表現解析の奇妙なことを経験せずに、これが必要な文字列を抽出するための最良の方法だと思います。
真実らしさ2012

3
正規表現ははるかに強力で、より多くの場合に使用できますが、簡単にするために、これは機能します...
MadProgrammer 2012

2
真剣に、なぜこれは反対票を引き付けるのでしょうか?動かないの?opsの質問に答えませんか?
MadProgrammer 2015

複数の値がある場合、どのように部分文字列を使用できますか?このような文字列'this is an example of <how><i have it>'があり、「<」と「>」の間の値を見つける必要があると考えてください
Vignesh

@Vignesh正規表現を使用する
MadProgrammer 2018年

74

indexOfを行うには、あなたから必要としないこの問題に非常に便利なソリューションを使用しているApacheのコモンズのライブラリを。

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

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

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


7
substringsBetween(...)複数の結果を期待する場合もあります。それが私が探していたものです。おかげで
cahen


72

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

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

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

s.substring(int start, int end);

30

正規表現を使用することにより:

 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)); 

2
「。*?」を使用して、これを欲張りでない一致にする必要があると思います。代わりに。文字列は次のようにsoemthingされている場合それ以外の場合は、 "67「のテスト文字列(67)と(68)、これは戻ります")と、(68。
Chthonicプロジェクト

18

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

10

一行で、私は提案します:

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

7

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

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

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

1
4つのスペースをインデントしてコードをフォーマットしてください。また.substring、.indexOf`が何をするのかわからない訪問者のためにあなたのコードが何をするのかを説明することによって、あなたの答えを少し埋めます。
バグ2017年

6

test string (67)2つの文字列の間にネストされた文字列を取得する必要がある文字列をテストします。

String str = "test string (67) and (77)", open = "(", close = ")";

いくつかの可能な方法をリストしました:単純な一般的な解決策:

String subStr = str.substring(str.indexOf( open ) + 1, str.indexOf( close ));
System.out.format("String[%s] Parsed IntValue[%d]\n", subStr, Integer.parseInt( subStr ));

Apache SoftwareFoundation commons.lang3

StringUtilsクラスsubstringBetween()関数は、2つの文字列の間にネストされた文字列を取得します。最初の一致のみが返されます。

String substringBetween = StringUtils.substringBetween(subStr, open, close);
System.out.println("Commons Lang3 : "+ substringBetween);

指定された文字列を、2つの文字列の間にネストされた文字列に置き換えます。 #395


正規表現のパターン: (\()(.*?)(\)).*

ドットマッチ(ほぼ)任意の文字 .? = .{0,1}, .* = .{0,}, .+ = .{1,}

String patternMatch = patternMatch(generateRegex(open, close), str);
System.out.println("Regular expression Value : "+ patternMatch);

正規表現-ユーティリティクラスRegexUtilsといくつかの関数を使用した式。
      Pattern.DOTALL行末記号を含むすべての文字に一致します。
      Pattern.MULTILINE入力シーケンスの開始^から終了までの文字列全体に一致し$ます。

public static String generateRegex(String open, String close) {
    return "(" + RegexUtils.escapeQuotes(open) + ")(.*?)(" + RegexUtils.escapeQuotes(close) + ").*";
}

public static String patternMatch(String regex, CharSequence string) {
    final Pattern pattern  = Pattern.compile(regex, Pattern.DOTALL);
    final Matcher matcher = pattern .matcher(string);

    String returnGroupValue = null;
    if (matcher.find()) { // while() { Pattern.MULTILINE }
        System.out.println("Full match: " + matcher.group(0));
        System.out.format("Character Index [Start:End]«[%d:%d]\n",matcher.start(),matcher.end());
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println("Group " + i + ": " + matcher.group(i));
            if( i == 2 ) returnGroupValue = matcher.group( 2 );
        }
    }
    return returnGroupValue;
}

StringUtilsは非常に便利です
TuGordoBello

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"

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);

    }

}

2
変数名を話すと、メソッドがより使いやすくなります。
ゾン2015

3

分割メソッドを使用して行う別の方法

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]);
}

3

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

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


2

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

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


Javaは正規表現をサポートしています。regexp4jライブラリは必要ありません;)
Andreas

2
String s = "test string (67)";

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

2

他の可能な解決策はlastIndexOf、文字または文字列を後方から検索する場所を使用することです。

私のシナリオでは、次のStringことがあり、抽出する必要がありました<<UserName>>

1QAJK-WKJSH_MyApplication_Extract_<<UserName>>.arc

だから、indexOfStringUtils.substringBetween彼らは最初からキャラクターを探し始めとして有用ではなかったです。

だから、私は使用しました lastIndexOf

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

そして、それは私に与えます

<<UserName>>

1

このようなもの:

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;
}

1

これは単純な使用の\D+正規表現と完了した仕事です。
これにより、数字を除くすべての文字が選択されます。複雑にする必要はありません。

/\D+/

1

一致する正規表現がない場合は、元の文字列を返します

var iAm67 = "test string (67)".replaceFirst("test string \\((.*)\\)", "$1");

コードに一致を追加する

String str = "test string (67)";
String regx = "test string \\((.*)\\)";
if (str.matches(regx)) {
    var iAm67 = str.replaceFirst(regx, "$1");
}

---編集---

https://www.freeformatter.com/java-regex-tester.html#ad-outputを使用しますを正規表現をテストします。

追加する方が良いことがわかりましたか?一致が少ない場合は*の後。このようなもの:

String str = "test string (67)(69)";
String regx1 = "test string \\((.*)\\).*";
String regx2 = "test string \\((.*?)\\).*";
String ans1 = str.replaceFirst(regx1, "$1");
String ans2 = str.replaceFirst(regx2, "$1");
System.out.println("ans1:"+ans1+"\nans2:"+ans2); 
// ans1:67)(69
// ans2:67
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.