【问题标题】:Validating whether a String is either starting or ending with a specified character using Regular Expression使用正则表达式验证字符串是否以指定字符开头或结尾
【发布时间】:2019-06-19 07:04:14
【问题描述】:

我需要验证输入字符串,以便它只允许在开头或结尾包含字符“E”、“W”、“N”、“S”(或其对应的小写字母)字符串(不是两者)。字符后跟数字。字符不能在数字之间。此外,如果它出现在开头,则它不能在结尾(反之亦然)。

我想出了这个正则表达式:[wWeEnNsS]{0,1}\\d+,它只检查开头的字符。但是我如何确保如果它出现在开头,那么它不能在结尾?

以下是有效输入的示例:

w234,
W234,
E234,
234w,
234

无效输入:

w234w,
2w34,
ww234,
we234,
w234e,
w

【问题讨论】:

  • 您必须使用 1 个正则表达式还是可以组合使用?
  • 我认为^(?![wWeEnNsS](?:.*[wWeEnNsS])?$)(?!.*\d[wWeEnNsS]\d)(?!.*[wWeEnNsS][^0-9]).+ 会为你工作。见demo

标签: java regex validation


【解决方案1】:

您可以使用不区分大小写的模式匹配来使用替代:

^[ewns][0-9]+$|^\d+[ewns]?$

在 Java 中

String regex = "^(?:[ewns]?[0-9]+|\\d+[ewns])$";
  • ^[ewns][0-9]+$ 字符串开头,匹配列出的字符中的 1 个和字符串结尾
  • |或者
  • ^\d+[ewns]?$ 字符串开头,可选匹配列出的字符中的 1 个和字符串结尾

Regex demo | Java demo

【讨论】:

  • 我想出了以下与您的解决方案几乎相似的解决方案:([wWeEnNsS]?(\\d+)$)|(\\d+[wWeEnNsS]?$)
  • 如果你在开始时没有锚定你的模式,你可能会有部分匹配 regex101.com/r/qesn9f/1