Как получить части строки с помощью регулярных выражений в Kotlin или Java? - PullRequest
1 голос
/ 17 февраля 2020

Предположим, у вас есть строка http://server.com/s123456 и вы хотите получить 123456 из нее. Или http://server.com/s123456&a=100 и получите 123456, 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. Есть ли способ написать маску, чтобы мы могли извлечь числа (или любые другие части) из строки?

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Вам нужно использовать группу захвата вокруг интересующей вас части. Используйте это "^http://server.com/s(\\d+)\$" и используйте it.groupValues[1].

1 голос
/ 17 февраля 2020

Вы можете попробовать просто (\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']
0 голосов
/ 17 февраля 2020

Благодаря @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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...