Как получить строку между двумя символами?
У меня есть строка,
String s = "test string (67)";
Я хочу получить № 67, который является строкой между (и).
Может кто-нибудь, пожалуйста, скажите мне, как это сделать?
24 ответа
Там, вероятно, действительно аккуратный RegExp, но я нуб в этой области, так что вместо этого...
String s = "test string (67)";
s = s.substring(s.indexOf("(") + 1);
s = s.substring(0, s.indexOf(")"));
System.out.println(s);
Очень полезное решение этой проблемы, которое не требует от вас выполнения indexOf, - использование библиотек Apache Commons.
StringUtils.substringBetween(s, "(", ")");
Этот метод позволит вам даже обрабатывать, даже если есть несколько вхождений закрывающей строки, что будет нелегко, если поискать закрывающую строку indexOf.
Вы можете скачать эту библиотеку здесь: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4
Попробуйте это так
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 input = "test string (67)";
input = input.subString(input.indexOf("(")+1, input.lastIndexOf(")"));
System.out.println(input);`
Вы можете использовать StringUtils общей библиотеки Apache для этого.
import org.apache.commons.lang3.StringUtils;
...
String s = "test string (67)";
s = StringUtils.substringBetween(s, "(", ")");
....
Тестовая строка 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 ));
Apache Software Foundation
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;
}
String result = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
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
public String getStringBetweenTwoChars(String input, String startChar, String endChar)
{
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 "";
}
return "";
}
Использование:
getStringBetweenTwoChars(s, "(", ")")
Другой способ сделать это с помощью метода 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]);
}
Использование 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, ""));
}
Это может помочь в более сложных задачах регулярного выражения, когда вы хотите получить текст между двумя наборами символов.
"Общий" способ сделать это - проанализировать строку с самого начала, отбросить все символы перед первой скобкой, записать символы после первой скобки и выбросить символы после второй скобки.
Я уверен, что есть библиотека регулярных выражений или что-то для этого.
Другим возможным решением является использование 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>>
String s = "test string (67)";
System.out.println(s.substring(s.indexOf("(")+1,s.indexOf(")")));
Он вернет исходную строку, если регулярное выражение не соответствует
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");
}
Что-то вроде этого:
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 и job done
.
Это выберите все символы, кроме цифр, не нужно усложнять
/\D+/
Пожалуйста, обратитесь ниже образец. Я создал образец согласно вашему требованию
образец: нажмите здесь
Небольшое расширение наверх (MadProgrammer) ответ
public static String getTextBetween(final String wholeString, final String str1, String str2){
String s = wholeString.substring(wholeString.indexOf(str1) + str1.length());
s = s.substring(0, s.indexOf(str2));
return s;
}
String s = "(69)";
System.out.println(s.substring(s.lastIndexOf('(')+1,s.lastIndexOf(')')));
Я получил ответ, как этот. Попытайся
String value = "test string (67)";
int intValue =Integer.valueOf( value.replaceAll("[^0-9]", ""));