#sql #regex #apache-spark-sql
#язык JavaScript #регулярное выражение
Вопрос:
У меня есть следующий URL-адрес:
http://data.test.com/api/v1/entity/1231
И мне нужно получить текст, который находится после v1/
и до /
(между косыми чертами), в данном случае слово entity
. Я использую следующее регулярное выражение, но то, что я получаю, относится entity/1231
к группе 1:
/^[^#?] /v1/([^?] ).*$/
Есть какие-нибудь идеи о том, как избавиться 1231
или от чего-нибудь, что последует за entity
этим ?
Комментарии:
1.
v1/([^/] )
илиv1/(.*?)/
2. Если детали закреплены
"http://data.test.com/api/v1/entity/1231".split("/")[5]
3. Если URL-адреса, с которыми вы работаете, настолько предсказуемы, то регулярные выражения, хотя и возможны, могут быть слишком сложным инструментом для этой работы. Являются ли URL-адреса изменяемыми? Всегда ли это будет » после
v1/
и до [следующего]/
«?4. @DavidThomas Да, они предсказуемы
5. Тебе нужно
str.match(//v1/([^/] )/)[1]
Ответ №1:
Вы можете записать нужное вам значение в группу захвата с помощью new RegExp("/v1/([^/] )"
:
var str = "http://data.test.com/api/v1/entity/1231"; var res = str.match(new RegExp("/v1/([^/] )")); if (res) console.log(res[1]);
Спички /v1/([^/] )
:
/v1/
— буквальная строка/v1/
([^/] )
— захват группы 1, соответствующей одному или нескольким символам, отличным от/
.
Благодаря обозначению конструктора в определении регулярного выражения нет необходимости избегать прямых косых черт в шаблоне регулярного выражения.
Кроме того, поскольку ECMAScript 2018 включил использование lookbehind в шаблонах регулярных выражений JavaScript, вы также можете использовать подход, основанный на lookbehind, чтобы получить нужное значение непосредственно в целом.:
const str = "http://data.test.com/api/v1/entity/1231"; const res = str.match(/(?lt;=/v1/)[^/] /); if (res) { console.log(res[0]); }
Подробные сведения:
(?lt;=/v1/)
— положительный внешний вид, соответствующий местоположению, которому непосредственно предшествует/v1/
текст[^/]
— один или несколько символов, отличных от/
символа.
Ответ №2:
попробуйте это:
^[^#?] /v1/([^?] ).*(w :{0,1}w*@)?(S )(:[0-9] )?(/1231)$