2016-01-26 4 views
2

Скажем, у меня есть строка что-то-123.Получить последние символы до определенного символа

Мне нужно получить последние 5 (или меньше) символов от него, но только до - если есть один в строке, так что результат будет, как вещь, но если строка не имеет - в нем, как something123 тогда результат будет ng123, и если строка, как тогда результат будет .

Я знаю, как Маха последние 5 символов:

/.{5}$/ 

Я знаю, как Маха все до первого -:

/[^-]*/ 

Но я не могу понять, как объединить их , и для того, чтобы усугубить ситуацию, мне нужно получить матч, не извлекая его из определенных групп и аналогичных передовых инструментов регулярного выражения, потому что я хочу использовать его в SQL Anywhere, пожалуйста, помогите.


Tank вы все за помощь, но выглядит как полное решение регулярное выражение будет слишком сложным для моей проблемы, так что я сделал это очень просто: SELECT right(regexp_substr('something-123', '[^-]*'), 4).

+0

Что делать, если вы '' что-то-в качестве входных данных, что, как ожидается выход для этой строки? 'вещь' или' hing-'? Мое решение дает «вещь». –

ответ

1

Вы можете использовать:

.{5}(?=(?:-[^-]*)?$) 

См the regex demo

Мы матч 5 отличных символа новой строки символов только до в строке последнего - или в самом конце строки ((?=(?:-[^-]*)?$)). Вам нужно только собрать совпадения, не нужно проверять группы/подматрицы.

UPDATE

Чтобы соответствовать либо 1 до 5, кроме дефиса перед первым дефисом (если он присутствует в строке) символов, вы можете использовать

([^-]{1,5})(?:(?:-[^-]*)*)?$ 

См demo. Мы полагаемся на взгляд здесь, что проверяет, есть ли после ожидаемой подстроки последовательности - + non-hyphen.

faster alternative:

^[^-]*?([^-]{1,5})(?:-|$) 

Это регулярное выражение будет искать любые другие, чем - до 1 до 5 таких символов символов.

Обратите внимание, что здесь, значение мы должны в группе 1.

+0

Я немного изменил его на 5 символов, так что '. {1,5} (? = (?: - [^ -] *)? $)', Но он не может работать с короткими строки до 5 символов в целом, как ** aa-bb **, он перехватывает все это, а не только ** aa **, как я ожидал. – Valdas

+0

Не могли бы вы уточнить, если подстроки, которые вам нужно совместить, могут содержать '-' или нет? Если нет, попробуйте ['([^ -] {1,5}) (?: - [^ -] *)? $'] (Https://regex101.com/r/wA0mP6/1). –

+0

Нет, мне не нужен дефис, только символы перед ним, если в строке есть дефис, если в строке нет дефиса, тогда мне нужно обработать последние символы строки. – Valdas

2

Одним из вариантов является группирование результат:

(.{4})- 

Теперь вы захватили результат, но без -.

Или с помощью lookarounds вы можете:

.{4}(?=-) 

, который соответствует любым из 4 символов, которые появляются перед тем "-".

+0

'(. {4}) -' соответствует дефису, '. {4} (? = -)' не так работает, как я спросил, но я забыл упомянуть одну мелочь, дефис, возможно, не был там, то оба предложенных выражения ничего не вызывают. – Valdas

+0

@ Cigaras Как я уже упоминал в своем ответе, ** ** ** ** ** не содержит «-», вам просто нужно извлечь результат из самой * группы *. Как вы тестируете результаты? Какой инструмент вы используете? – Maroun

+0

http://regexr.com/, извините, я новичок в этом регулярном выражении, а текст просто нужно извлечь результат из самой группы_, ничего мне не сказал. – Valdas

1

Как насчет:

(.{5})(?:-[^-]+)?$ 

В результате в группе 1

+0

аполоазий, я пытался отредактировать свой ответ и щелкнуть мышью. Мой плохой – Aferrercrafter

1

Попробуйте это регулярное выражение:

(.{1,5})(?:-.*|$) 

Группа 1 имеет результат, что нужно

demo

Смежные вопросы