Разделение строки с разделителем


96

В настоящее время я пытаюсь разбить строку, 1128-2чтобы иметь два отдельных значения. Например, значение1: 1128 и значение2: 2, чтобы затем можно было использовать каждое значение отдельно. я пыталсяsplit() но безуспешно. Есть ли в Grails особый способ справиться с этим или лучший способ сделать это?


Мне любопытно, почему это не сработало с просто сплитом? (a, b) = "ab" .split ("-") отлично работает для меня (и я считаю, что это будет работать и на Java). Я использую это все время. РЕДАКТИРОВАТЬ: Просто взглянув на это, они немного отличаются - split возвращает массив, а tokenize возвращает ArrayList. Практически то же самое в Groovy, преимущество split в том, что он легко переносится на Java, я не думаю, что tokenize - это java-метод для String (если только он не новый, и я его пропустил)
Билл К.

Ответы:


175

Пытаться:

def (value1, value2) = '1128-2'.tokenize( '-' )

31
Это хорошее чтение на splitvs tokenize tothenew.com/blog/groovy-tokenize-vs-split
Snekse

5
О, и будьте осторожны, если вы разбиваете определенные символы, как трубку |. Вам нужно будет избежать символа stackoverflow.com/questions/3842537/…
Snekse

2
Да, в cos split используется регулярное выражение
tim_yates

63

Как ты звонишь split? Это работает так:

def values = '1182-2'.split('-')
assert values[0] == '1182'
assert values[1] == '2'

10
Я думаю, что очень полезно добавить крайний случай, с которым вы можете столкнуться при разделении по '.' char. Таким образом, вам нужно будет экранировать точку, если вы хотите разделить на буквальную точку: в String extensionRemoved = filename.split("\\.")[0]; противном случае вы разбиваете на регулярное выражение., Что означает «любой символ». Обратите внимание на двойную обратную косую черту, необходимую для создания одиночной обратной косой черты в регулярном выражении.
Exequiel Barrirero

Спасибо за это. Этот метод был написан так, чтобы запутать как можно больше людей.
Дастин

@ExequielBarrirero Этот комментарий сегодня спас мне жизнь
user3692823

23

def (value1, value2) = '1128-2'.split('-') должно сработать.

Может ли кто-нибудь попробовать это в Groovy Console?

def (v, z) =  '1128-2'.split('-')

assert v == '1128'
assert z == '2'

1
У меня была проблема с этим, если вы хотите разделить на некоторые типы символов регулярных выражений, например. или *. Вам нужно избежать этого, токенизация работает и в этих случаях.
chandank

7

Вы также можете:

Integer a = '1182-2'.split('-')[0] as Integer
Integer b = '1182-2'.split('-')[1] as Integer

//a=1182 b=2


0
dependencies {
   compile ('org.springframework.kafka:spring-kafka-test:2.2.7.RELEASE') { dep ->
     ['org.apache.kafka:kafka_2.11','org.apache.kafka:kafka-clients'].each { i ->
       def (g, m) = i.tokenize( ':' )
       dep.exclude group: g  , module: m
     }
   }
}

Здравствуйте! Хотя этот код может решить вопрос, в том числе объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста , измените свой ответ , чтобы добавить объяснения и дать указание о том , что применять ограничения и допущения.
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.