मेरे पास एक तार है,
String s = "test string (67)";
मैं 67 नंबर (और) के बीच का स्ट्रिंग प्राप्त करना चाहता हूं।
क्या कोई मुझे बता सकता है कि यह कैसे करना है?
जवाबों:
वहाँ शायद एक बहुत साफ RegExp है, लेकिन मैं उस क्षेत्र में noob हूँ, इसलिए इसके बजाय ...
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>'और मुझे '<' और '>' के बीच मान खोजने की आवश्यकता है
इस समस्या का एक बहुत ही उपयोगी समाधान जो आपको इंडेक्सऑफ करने की आवश्यकता नहीं है अपाचे कॉमन्स पुस्तकालयों का उपयोग कर रहा है ।
StringUtils.substringBetween(s, "(", ")");
यह विधि आपको तब भी हैंडल करने की अनुमति देगी भले ही समापन स्ट्रिंग के कई घटनाएं हों जो इंडेक्सऑफ समापन स्ट्रिंग की तलाश में आसान न हों।
आप इस पुस्तकालय को यहाँ से डाउनलोड कर सकते हैं: 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));
जावा रेगुलर एक्सप्रेशन का समर्थन करता है , लेकिन अगर आप वास्तव में उन्हें मैच निकालने के लिए उपयोग करना चाहते हैं तो वे बोझिल हैं। मुझे लगता है कि आप अपने उदाहरण में जो स्ट्रिंग चाहते हैं उसे पाने का सबसे आसान तरीका है कि आप 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
आप ऐसा करने के लिए अपाचे कॉमन लाइब्रेरी के स्ट्रिंगरिटल्स का उपयोग कर सकते हैं।
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समझाऊंगा कि आपके आने वाले लोगों के लिए आपका कोड क्या करता है जो अनिश्चित हैं । andindexOf` क्या करता है।
परीक्षण स्ट्रिंग test string (67)जिसमें से आपको स्ट्रिंग प्राप्त करने की आवश्यकता होती है जो कि दो स्ट्रिंग्स के बीच में निहित है।
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 ));
अपाचे सॉफ्टवेयर फाउंडेशन
commons.lang3।
StringUtilsक्लास substringBetween()फंक्शन को स्ट्रिंग मिलता है जिसे दो स्ट्रिंग्स के बीच में घोंसला बनाया जाता है। केवल पहला मैच ही लौटा है।
String substringBetween = StringUtils.substringBetween(subStr, open, close);
System.out.println("Commons Lang3 : "+ substringBetween);
दिए गए स्ट्रिंग को बदल देता है, स्ट्रिंग के साथ जो दो स्ट्रिंग्स के बीच में घोंसला है। #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);
}
}
मुझे रेगेक्स और पैटर्न / माचिस वर्गों के साथ ऐसा करने का सबसे कम सामान्य तरीका मिला:
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, ""));
}
यह और अधिक जटिल regex समस्याओं के लिए मदद कर सकता है जहाँ आप दो अक्षरों के बीच पाठ प्राप्त करना चाहते हैं।
ऐसा करने का "सामान्य" तरीका स्ट्रिंग को शुरू से पार्स करना है, पहले ब्रैकेट से पहले सभी वर्णों को फेंकना, पहले ब्रैकेट के बाद वर्णों को रिकॉर्ड करना, और दूसरे ब्रैकेट के बाद वर्णों को फेंक देना।
मुझे यकीन है कि वहाँ एक regex पुस्तकालय या इसे करने के लिए कुछ है।
अन्य संभव समाधान यह है 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;
}
यह एक सरल उपयोग \D+regex और काम किया है।
यह अंकों को छोड़कर सभी वर्णों का चयन करता है, जटिल करने की आवश्यकता नहीं है
/\D+/
अगर मैच रेगेक्स नहीं है तो यह मूल स्ट्रिंग लौटाएगा
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");
}
--- संपादित करें ---
मैं regex का परीक्षण करने के लिए 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
(या पहले के सूचकांक को खोजने(और)और सबस्ट्रिंग या, ज्यादातर लोगों क्या करेंगे, रेगुलर एक्सप्रेशन का उपयोग के साथ करते हैं।