Предположим, у вас есть строка http://server.com/s123456 и вы хотите получить 123456 из нее. Или http://server.com/s123456&a=100 и получите 123456, 100. Множество различных ситуаций, в которых вы хотите иметь части строки.
http://server.com/s123456
123456
http://server.com/s123456&a=100
Для сопоставления строк я использую регулярные выражения.
@Test fun test() { val text = "http://server.com/s123456" // Source string. val reg = "^http://server.com/s\\d+\$".toRegex() assertEquals(true, reg.matches(text)) // Try to split the string with findAll(). val a: Sequence<MatchResult> = reg.findAll(text, 0) val names = a.map { it.groupValues[0] }.joinToString() println(names) // http://server.com/s123456 }
Но это не разбивает исходную строку на символы и цифры, а печатает: http://server.com/s123456. Есть ли способ написать маску, чтобы мы могли извлечь числа (или любые другие части) из строки?
Вам нужно использовать группу захвата вокруг интересующей вас части. Используйте это "^http://server.com/s(\\d+)\$" и используйте it.groupValues[1].
"^http://server.com/s(\\d+)\$"
it.groupValues[1]
Вы можете попробовать просто (\d+)
(\d+)
Пример (записано в Python):
a = 'http://server.com/s123456' b = 'http://server.com/s123456&a=100' c = 'http://server.com/s122&&&' d = 'http://server.com/s1234!56&a=100terere' lis=[a,b,c,d] for item in lis: print(re.findall(r'(\d+)', item ))
output
['123456'] ['123456', '100'] ['122'] ['1234', '56', '100']
Благодаря @Eraklon и @moys я написал аналогичный ответ.
@Test fun test1() { val text = "http://server.com/s123456" val reg = "^http://server.com/s(\\d+)\$".toRegex() val a = reg.findAll(text, 0) val names = a.map { it.groupValues[1] }.joinToString() println(names) // 123456 assertEquals(true, reg.matches(text)) } @Test fun test2() { val a = "http://server.com/s123456" val b = "http://server.com/s123456&a=100" val c = "http://server.com/s122&&&" val d = "http://server.com/s1234!56&a=100terere" val e = "http://server.com/s" val f = "http://server.com" val reg = "(\\d+)".toRegex() val list = listOf(a, b, c, d, e, f) list.map { item -> val groups: Sequence<MatchResult> = reg.findAll(item, 0) val names = groups.map { it.groupValues[1] }.joinToString() println(names) } // Output: // 123456 // 123456, 100 // 122 // 1234, 56, 100 // // val groups: Sequence<MatchResult> = reg.findAll(e, 0) val names = groups.map { it.groupValues[1] }.firstOrNull() println(names) // null }