Ответ 1
Вы запрашиваете 0 или более цифр. Вам нужно запросить 1 или больше:
"\\d+"
Я хотел бы использовать regex с Java.
Что я хочу сделать, это найти первое целое число в строке.
Пример:
String = "the 14 dogs ate 12 bones"
Вернется 14.
String = "djakld;asjl14ajdka;sdj"
Также вернется 14.
Это то, что у меня есть до сих пор.
Pattern intsOnly = Pattern.compile("\\d*");
Matcher makeMatch = intsOnly.matcher("dadsad14 dssaf jfdkasl;fj");
makeMatch.find();
String inputInt = makeMatch.group();
System.out.println(inputInt);
Что я делаю неправильно?
Вы запрашиваете 0 или более цифр. Вам нужно запросить 1 или больше:
"\\d+"
Похоже, что другим решениям не удалось обработать +/-
и такие случаи, как 2e3
, поддержка java.lang.Integer.parseInt(String)
, поэтому я пойду на эту проблему. Я немного неопытен в регулярном выражении, поэтому я, возможно, допустил несколько ошибок, использовал то, что парсер Java regex не поддерживает, или сделал его чрезмерно сложным, но показания, казалось, работали в Kiki 0.5.6.
Все регулярные выражения предоставляются как в незапрограммированном формате для чтения, так и в формате escaped, который можно использовать в качестве строкового литерала в Java.
Чтобы получить байт, короткий, int или длинный от строки:
unescaped: ([\+-]?\d+)([eE][\+-]?\d+)?
escaped: ([\\+-]?\\d+)([eE][\\+-]?\\d+)?
... и для бонусных очков...
Чтобы получить double или float из строки:
unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
Это удобный, который я сделал для С# с дженериками. Он будет соответствовать вашим регулярным выражениям и возвращать нужные вам типы:
public T[] GetMatches<T>(string Input, string MatchPattern) where T : IConvertible
{
List<T> MatchedValues = new List<T>();
Regex MatchInt = new Regex(MatchPattern);
MatchCollection Matches = MatchInt.Matches(Input);
foreach (Match m in Matches)
MatchedValues.Add((T)Convert.ChangeType(m.Value, typeof(T)));
return MatchedValues.ToArray<T>();
}
то, если вы хотите захватить только числа и вернуть их в строку [] array:
string Test = "22$data44abc";
string[] Matches = this.GetMatches<string>(Test, "\\d+");
Надеюсь, это полезно кому-то...
В дополнение к тому, что сказал PiPeep, если вы пытаетесь сопоставить целые числа внутри выражения, так что 1 + 2 - 3
будет соответствовать только 1
, 2
и 3
, а не 1
, + 2
и - 3
, вам действительно нужно использовать оператор lookbehind, а часть, которую вы хотите, будет фактически возвращена Matcher.group(2)
, а не только Matcher.group()
.
unescaped: ([0-9])?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
escaped: ([0-9])?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)
Кроме того, для таких вещей, как someNumber - 3
, где someNumber
- имя переменной или что-то в этом роде, вы можете использовать
unescaped: (\w)?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
escaped: (\\w)?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)
Хотя, конечно, это не работает, если вы разбираете строку типа The net change to blahblah was +4
спецификация java действительно дает этому монстру регулярное выражение для парсинга двойников. однако это считается плохой практикой, просто пытаясь разобрать с предполагаемым типом и поймать ошибку, имеет тенденцию быть немного читабельнее.
DOUBLE_PATTERN = Pattern
.compile("[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)"
+ "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|"
+ "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))"
+ "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");