我一直在尝试检查我的字符串的开头或结尾是否带有下划线或连字符。
// pass
sdq
lorem ipsum
abc_def
harry-_potter
// catch
fg_
_asq
_dqw-
-asq-sq
尝试了以下内容,但是我正在学习正则表达式,所以我不太确定如何从这里继续前进:
/^[-_]?.*[-_]$/
^ => beginning anchor
[-_]? => start with either - or _, optionally
.* => match any number of any character (I believe I could have used ranges here)
[-_]$ => check for - or _ at the end
我也知道一种可能的解决方案是使用|
(用于条件),而我需要的是能够检查以下内容:
在字符串的或末尾有一个加号或下划线。
我该如何检查?我可以使用|
以外的其他东西吗?
答案 0 :(得分:1)
自从OP特别询问了这一部分:
我可以使用
|
以外的其他东西吗?
这是一个不使用轮换的正则表达式解决方案,它使用negative lookahead施加一个条件,即最后一个字符不能为_
或-
:
/^(?!.*[-_]$)[^-_].*/mg
RegEx详细信息:
(?!.*[-_]$)
是一个否定的超前查询,表示匹配失败的原因是-
或_
刚到行尾。[^-_]
是一个否定的字符类,表示匹配任何不是-
或_
的字符。说过,最简单有效的解决方案就是我之前在评论中写的内容,即使用交替:
/^[-_]|[-_]$/mg
使用此正则表达式检查不匹配项并使其失败。
答案 1 :(得分:0)
您需要替换。在开头匹配[-_]
(后跟其他字符),或者或匹配任意数量的字符,然后在字符串末尾匹配[-_]
:
^(?:[-_].*|.*[-_])$
https://regex101.com/r/e7ESHW/1
该组不是不必要的,但我认为它使模式的意图更加清晰(匹配项必须与字符串的全长匹配)。您可以根据需要将其忽略:
^[-_].*|.*[-_]$
如果您根本不关心匹配的字符,只想看看如果字符串以/开头,则以短划线或下划线表示,那么您可以忽略{{ 1}} s。
答案 2 :(得分:0)
我可以使用|以外的其他内容吗?
如果您不想使用正则表达式,请使用startsWith
和endsWith
let arr = ['sdq', 'lorem ipsum', 'abc_def', 'harry-_potter', 'fg_', '_asq', '_dqw-', '-asq-sq']
let tester = (str) => {
return !(str.startsWith('-') || str.startsWith('_') || str.endsWith('-') || str.endsWith('_'))
}
arr.forEach(str => console.log(str, '--->', tester(str)))