私はひもを持っています、
String s = "test string (67)";
(と)の間の文字列である67番を取得したいと思います。
誰かがこれを行う方法を教えてもらえますか?
回答:
おそらく本当に素晴らしい正規表現がありますが、私はその分野では初心者なので、代わりに...
String s = "test string (67)";
s = s.substring(s.indexOf("(") + 1);
s = s.substring(0, s.indexOf(")"));
System.out.println(s);
'this is an example of <how><i have it>'
があり、「<」と「>」の間の値を見つける必要があると考えてください
indexOfを行うには、あなたから必要としないこの問題に非常に便利なソリューションを使用しているApacheのコモンズのライブラリを。
StringUtils.substringBetween(s, "(", ")");
このメソッドを使用すると、indexOfの終了文字列を探すだけでは簡単ではない、終了文字列が複数回出現する場合でも処理できます。
このライブラリはここからダウンロードできます:https: //mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4
substringsBetween(...)
複数の結果を期待する場合もあります。それが私が探していたものです。おかげで
このようにしてみてください
String s="test string(67)";
String requiredString = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
部分文字列に対するメソッドのシグネチャは次のとおりです。
s.substring(int start, int end);
正規表現を使用することにより:
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));
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
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
これを行うには、Apache共通ライブラリのStringUtilsを使用できます。
import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....
String result = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
.substring
、.indexOf`が何をするのかわからない訪問者のためにあなたのコードが何をするのかを説明することによって、あなたの答えを少し埋めます。
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;
}
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"
使用する 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);
}
}
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番目の括弧の後に文字を破棄することです。
正規表現ライブラリかそれを行うための何かがあると確信しています。
他の可能な解決策は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>>
このようなもの:
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;
}
一致する正規表現がない場合は、元の文字列を返します
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
(
、または最初のインデックスを見つける(
と)
、ほとんどの人はどうなるのか、サブストリングまたはでそれを行う、正規表現を使用します。