【问题标题】:Regex for - or _ at beginning or end of string正则表达式 - 或 _ 在字符串的开头或结尾
【发布时间】:2019-09-18 05:47:15
【问题描述】:

我一直在尝试检查我的字符串的开头或结尾是否有下划线或连字符。

// 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

我也知道一种可能的解决方案是使用|,它用于条件,我需要的是能够检查:

在字符串的开头结尾处有一个连字符或下划线。

我该如何检查?我可以使用|以外的东西吗?

【问题讨论】:

  • /^[-_]|[-_]$/ 是正确的解决方案。
  • 要匹配完整的字符串,您可以使用^[-_].*|.*[-_]$
  • /^[-_]|[_-]$/ 只是为了保持对称;)
  • @CinCout stackoverflow.com/a/4544642/2317490 ;不是说op会面对它,我每次看到dot-star都会发冷......
  • @Janie:我会发布一个答案,但 OP 询问 我可以使用 | 以外的其他东西吗? 所以我不确定基于替代的答案是否正确OP的回答与否。

标签: javascript regex


【解决方案1】:

由于 OP 专门询问了这部分:

我可以使用|以外的东西吗?

这是一个不使用交替并使用negative lookahead 来应用最后一个字符不能是_- 的条件的正则表达式解决方案:

/^(?!.*[-_]$)[^-_].*/mg

正则表达式详细信息:

  • (?!.*[-_]$) 是负前瞻,这意味着匹配失败是在行尾之前找到 -_
  • [^-_] 是一个否定字符类,表示匹配任何不是-_ 的字符。

RegEx Demo

话虽如此,最简单有效的解决方案将是我之前在评论中所写的,即使用交替:

/^[-_]|[-_]$/mg

使用这个正则表达式来检查和排除你的不匹配。

【讨论】:

  • 我投了赞成票。您能否解释一下答案中的第一个正则表达式?
  • 我已经发布了更多详细信息,并且我的答案中有很好的链接,可以阅读更多关于环顾四周的信息。
【解决方案2】:

您需要交替使用。要么匹配开头的[-_](后跟其他字符),要么匹配任意数量的字符,然后匹配字符串末尾的[-_]

^(?:[-_].*|.*[-_])$

https://regex101.com/r/e7ESHW/1

组不是必要的,但我认为它使模式的意图更清晰(匹配必须匹配字符串的全长)。如果您愿意,可以将其省略:

^[-_].*|.*[-_]$

如果您根本不关心匹配的字符,而只想查看 if 字符串以 / 以破折号或下划线结尾,那么您可以省略 @987654326 @s.

【讨论】:

  • 很好奇,为什么是组?为什么不捕获?
  • @dandavis 可以说,该组可能是不必要的,但为什么您认为它不应该是一个非捕获组?我也很好奇为什么会投反对票!我认为答案没有错。
  • @dandavis 我在想(就像 OP 的当前模式一样)匹配应该跨越字符串的整个长度,所以交替组两侧的 ^$ 确保发生这种情况.仅在需要时才应使用捕获组 - 如果不需要,则应使用非捕获组,它既便宜又使模式的意图更清晰。
  • 是的,但你根本不需要组
  • @dandavis 不完全确定该模式的使用方式,我试图修复 OP 的模式,同时仍然匹配完整的字符串。如果 OP 只是使用.test 之类的东西,那么是的,不需要检查其他字符,但是如果他想提取某些匹配项,则应该匹配整个长度
【解决方案3】:

我可以使用 | 以外的东西吗?

如果您不想使用正则表达式,请使用 startsWithendsWith

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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 2021-07-04
    • 2016-11-07
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多