【发布时间】:2011-04-19 08:46:08
【问题描述】:
是否可以编写一个正则表达式来匹配所有不仅包含数字的字符串?如果我们有这些字符串:
- abc
- a4c
- 4bc
- ab4
- 123
它应该匹配前四个,而不是最后一个。我曾尝试在 RegexBuddy 中摆弄前瞻之类的东西,但我似乎无法弄清楚。
【问题讨论】:
标签: regex
是否可以编写一个正则表达式来匹配所有不仅包含数字的字符串?如果我们有这些字符串:
它应该匹配前四个,而不是最后一个。我曾尝试在 RegexBuddy 中摆弄前瞻之类的东西,但我似乎无法弄清楚。
【问题讨论】:
标签: regex
/^\d*[a-z][a-z\d]*$/
或者,不区分大小写的版本:
/^\d*[a-z][a-z\d]*$/i
可能是一个数字开头,然后是至少一个字母,然后是字母或数字
【讨论】:
我必须在 MySQL 中做类似的事情,而以下过度简化的事情似乎对我有用:
其中字段名正则表达式^[a-zA-Z0-9]+$
和字段名不是正则表达式^[0-9]+$
这会显示所有字母和字母数字字段,但任何只是数字的字段都被隐藏。这似乎有效。
示例:
name1 - 已显示
名称 - 显示
name2 - 显示
name3 - 显示
name4 - 显示
n4ame - 显示
324234234 - 未显示
【讨论】:
我在我的 JavaScript 代码中使用/^[0-9]*$/gm 来查看字符串是否只是数字。如果是,那么它应该失败,否则它将返回字符串。
下面是带有测试用例的工作代码 sn-p:
function isValidURL(string) {
var res = string.match(/^[0-9]*$/gm);
if (res == null)
return string;
else
return "fail";
};
var testCase1 = "abc";
console.log(isValidURL(testCase1)); // abc
var testCase2 = "a4c";
console.log(isValidURL(testCase2)); // a4c
var testCase3 = "4bc";
console.log(isValidURL(testCase3)); // 4bc
var testCase4 = "ab4";
console.log(isValidURL(testCase4)); // ab4
var testCase5 = "123"; // fail here
console.log(isValidURL(testCase5));
【讨论】:
.*[^0-9]{1,}.*
对我们来说很好。
我们想使用使用过的答案,但它不适用于 YANG 模型。
我在这里提供的内容很容易理解,而且很清楚: start 和 end 可以是任何字符,但是,必须至少有一个 NON NUMERICAL 字符,这是最大的。
【讨论】:
(?!^\d+$)^.+$
这表示不包含所有数字但与整行匹配的行的前瞻。
【讨论】:
如果您尝试匹配至少有一个字母但它们由数字和字母(或只是字母)组成的世界,这就是我使用的:
(\d*[a-zA-Z]+\d*)+
【讨论】:
试试这个:
/^.*\D+.*$/
如果有任何符号,则返回true,它不是数字。适用于所有语言。
【讨论】:
如果我们想限制有效字符以便可以由一组有限的字符组成字符串,试试这个:
(?!^\d+$)^[a-zA-Z0-9_-]{3,}$
或
(?!^\d+$)^[\w-]{3,}$
/\w+/: 匹配任何字母、数字或下划线。任何单词字符
【讨论】:
jjnguy 在earlier revision 中正确(如果有点多余的话)。
.*?[^0-9].*
@Chad,你的正则表达式,
\b.*[a-zA-Z]+.*\b
可能应该允许非字母(例如,标点符号),即使 Svish 的示例不包括一个。 Svish 的主要要求是:不能都是数字。
\b.*[^0-9]+.*\b
然后,您不需要其中的 +,因为您只需要保证其中有 1 个非数字(可能会在 .* 的末尾覆盖更多)。
\b.*[^0-9].*\b
接下来,您可以取消任何一端的 \b,因为这些是不必要的约束(调用对 alphanum 和 _ 的引用)。
.*[^0-9].*
最后,请注意,最后一个正则表达式表明问题可以通过基础知识来解决,这些基础知识已经存在了几十年(例如,不需要前瞻功能)。在英语中,这个问题在逻辑上等同于简单地要求在一个字符串中找到 1 个反例字符。
我们可以通过将以下内容复制到地址栏中来在浏览器中测试此正则表达式,将字符串“6576576i7567”替换为您要测试的任何内容。
javascript:alert(new String("6576576i7567").match(".*[^0-9].*"));
【讨论】:
除非我遗漏了什么,否则我认为最简洁的正则表达式是......
/\D/
...或者换句话说,字符串中是否有非数字?
【讨论】:
codes = ['abc', 'a4c', '4bc', 'ab4', '123']codes.map { |code| code.match(/\D/) }=> [#<MatchData "a">, #<MatchData "a">, #<MatchData "b">, #<MatchData "a">, nil]codes.map { |code| code.match(/(?!^\d+$)^.+$/) }=> [#<MatchData "abc">, #<MatchData "a4c">, #<MatchData "4bc">, #<MatchData "ab4">, nil]
/\D/ 的匹配数据返回第一个字母,而 mote complex 的匹配返回示例中的整个代码。总而言之,它们似乎都同样可用,除非出于某种原因,您需要对匹配的数据执行操作。
既然你说“匹配”,不只是验证,下面的正则表达式会正确匹配
\b.*[a-zA-Z]+.*\b
通过测试:
abc
a4c
4bc
ab4
1b1
11b
b11
测试失败:
123
【讨论】:
[a-zA-Z] 与\D 不同。 \D 是“不是数字”。因此,如果他们真的不想要 0-9 并且可以使用标点符号,那么是的,\D 会更准确。