英文:
Regular Expression for not allowing two consecutive special characters and also not in beginning and end
问题
以下是您要的翻译内容:
我正在寻找一个用于字符串的正则表达式,以满足以下条件:
- 只包含 A-Z、a-z、0-9、_、-、.
- 不以 _、-、. 开头或结尾。
- 不包含连续的特殊字符或它们的组合。
- 长度最大为 36,最小为 1。
正确示例:
abcd-efgH
1
a
123
abc
abc-asd-123-asd_asd.asd
错误示例:
-
abc-_asd
abc.
abc.-asd
123123-123123-ads--asd
091-asdsad---
我在周围搜索并找到了以下内容:
/^(?!.*[^\na-z0-9]{2})(?=.*[a-z0-9]$)[a-z0-9].*$/gim
但这允许所有特殊字符,而不仅仅是我检查的这三个。
英文:
I'm looking for a regex for a string to
- Contain only A-Z a-z 0-9 _ - .
- Not begin/end with _ - .
- Not containing consecutive special characters or their combination
- Max 36 length, minimum 1
Right
abcd-efgH
1
a
123
abc
abc-asd-123-asd_asd.asd
Wrong:
-
abc-_asd
abc.
abc.-asd
123123-123123-ads--asd
091-asdsad---
I seearched around and got this :-
/^(?!.*[^\na-z0-9]{2})(?=.*[a-z0-9]$)[a-z0-9].*$/gim
but this allows all special characters and not just the 3 that i checek
答案1
得分: 5
你可以在这个正则表达式中使用3个零宽断言:
^(?![-_.])(?!.*[-_.]{2})(?!.*[-_.]$)[-\w.]{1,36}$
正则表达式详解:
^
:开头(?![-_.])
:负向前瞻,不允许在开头出现[-_.]
(?!.*[-_.]{2})
:负向前瞻,不允许任何地方出现连续的两个[-_.]
(?!.*[-_.]$)
:负向前瞻,不允许在结尾出现[-_.]
[-\w.]{1,36}
:匹配一个[-a-zA-Z0-9_.]
字符,最少1个,最多36个$
:结尾
英文:
You may use this regex with 3 lookaheads:
^(?![-_.])(?!.*[-_.]{2})(?!.*[-_.]$)[-\w.]{1,36}$
RegEx Details:
^
: Start(?![-_.])
: Negative lookahead to disallow[-_.]
at the start(?!.*[-_.]{2})
: Negative lookahead to disallow 2 consecutive[-_.]
anywhere(?!.*[-_.]$)
: Negative lookahead to disallow[-_.]
at the end[-\w.]{1,36}
: Match a[-a-zA-Z0-9_.]
character, min: 1, max: 36$
: End
答案2
得分: 1
你是说类似于:
/^(?!.{37,})[a-z\d]+(?:[-._][a-z\d]+)*$/gim
查看在线演示[这里](https://regex101.com/r/10bmbN/6)
---
* `^` - 字符串起始锚点。
* `(?!.{37,})` - 负向先行断言,限制最少37个字符。
* `[a-z\d]+` - 至少一个字符在这个字符组内。
* `(?:` - 打开非捕获组。
* `[-._]` - 单个字符在这个字符组内。
* `[a-z\d]+` - 至少一个字符在这个字符组内。
* `)*` - 关闭非捕获组并允许匹配零次或多次。
* `$` - 字符串结束锚点。
英文:
Do you mean something like:
/^(?!.{37,})[a-z\d]+(?:[-._][a-z\d]+)*$/gim
See the online demo
^
- Start string ancor.(?!.{37,})
- Negative lookahead for 37 characters or more.[a-z\d]+
- At least a single character within this character group.(?:
- Open non-capturing group.[-._]
- A single character within this character group.[a-z\d]+
- At least a single character within this character group.)*
- Close non-capturing group and match it zero or more times.
$
- End string ancor.
答案3
得分: 0
我认为解决这个问题最简单、直接且直观逻辑的方法如下:
/^([a-z\d]|(?<![-_])(?<!^)[-_](?!$)){2,36}$/gim
解释非常简单。
第一个字符可以是字母或数字 或者
(|)第一个字符可以是 _
或 -
,因为前一个字符
a) 不是 _
也不是 -
。
前一个字符的条件在 负回顾后查找 中:(?<![-_])
这意味着,使用当前光标位置,负回顾后查找(由 (?<! P)
模式表示,其中 P
是模式),只有在模式 P
不匹配时才可以(PS:回顾后查找不移动光标)
在这种情况下,模式 P
就是 [-_]
。如果 P
后面不是 -
或 _
,那么 -
或 _
就是一个可选项!
b) _
或 -
不在开头
紧接着我们又有一个只测试文本开头的负回顾后查找。P 就是 ^(表示文本开头的锚点)
。负回顾后查找部分是 (?<!^)
(P 就是 ^
)
c) _
或 -
不在结尾
最后,我们有一个负前瞻后出现在 [-_] 实际模式之后。唯一的语法差异是剪切字符 <
(?P
,其中 P
是模式)。现在,正则表达式处理在向前搜索模式 P,而不移动光标。如果模式失败,没关系(负面的!)
在这种情况下,我们有 (?!$)
,其中 P
是 $
,表示文本末尾的锚点。
例如:
ABCDEFGHIJKLMNOPQRSTU-XYZ01234_56789
匹配
但 ABCDEFGHIJKLMNOPQRSTU-_XYZ0123456789
不匹配
也不匹配 ABCDEFGHIJKLMNOPQRSTU-XYZ012345678_
也不匹配 _BCDEFGHIJKLMNOPQRSTU-XYZ0123456789
在此在线查看 此处:
英文:
I think the simplest and most direct way to solve this problem, in an intuitive and logical way, is the following:
/^([a-z\d]|(?<![-_])(?<!^)[-_](?!$)){2,36}$/gim
The explanation is pretty simple.
The first char can be letter or digit OR
(|) the first character can be additionally be _
or -
, since the previous char
a) is not _
neither -
.
The previous char condition is in the negative lookbehind: (?<![-_])
It means, using the current cursor position, a negative look behind (represented by (?<! P)
model, where P
is a pattern) and it's ok just if pattern P
don't (negative
) fit (PS: Lookbehind don't move the cursor)
In this case, pattern P
is just [-_]
. If P
behind is not -
neither _
, it means that -
or _
are allowed as a option!
b) _
ou -
is not in the start
Right after that we have another negative look behind that tests only the beginning of the text. P is just ^(the anchor that indicates start of the text). The look behind piece is (?<!^)
(P
is just ^
)
c) _
ou -
is not in the end
Finally we have a negative look forward, but is appears after [-_] real pattern. The only syntax difference is cut "<" character (?!P
, where P
is the pattern). Now, the regex processing is search forward for the pattern P, without move the cursor. If the pattern fail is OK (negative!)
In the case, we have (?!$)
, where P
is $
, the anchor that indicates the end of the text.
for example:
ABCDEFGHIJKLMNOPQRSTU-XYZ01234_56789
matches
but ABCDEFGHIJKLMNOPQRSTU-_XYZ0123456789
doesn't match
neither ABCDEFGHIJKLMNOPQRSTU-XYZ012345678_
neither _BCDEFGHIJKLMNOPQRSTU-XYZ0123456789
See online here:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论