我有一个十进制数,s
需要满足以下条件:
((s>=97 && s<=122 )&&(s>=65 && s<=90)&&(s>=48 && s<=57)&&
((s>=33 && s<=47)||(s>=58 && s<=64)||(s>=91 && s<=96)||(s>=123 && s<=126))){
ints
实际上是基于 ASCII 表的十进制数。
上面的条件可以转换成正则格式吗?
是的你可以。但你不应该。上面的条件是数字运算,因此如果将它们保留为数字运算,它们将是类型安全的、快速且易于理解的。
您列出的条件归结为以下内容:
if (s >= 33 && s <= 126) {
switch ((int)s) {
case 47:
case 57:
case 64:
case 90:
case 97:
case 122:
return s == (int)s;
default:
return true;
}
}
return false;
我不确定s == (int)s
事情会不会飞,因为我是 C# 人。该行的想法是如果s
是整数则产生真,否则产生假。
简短而甜蜜的选择:
float[] temp = new float[] { 47, 57, 64, 90, 97 };
return s >= 33 && s <= 126 && (!temp.contains((int)s) || s == (int)s);
以上是执行此操作的“正确”方法。如果您必须使用正则表达式,您可以使用以下方法:
String pattern = "([459]7|64|90|122)\\.[0-9]+";
return s >= 33 && s <= 126 && !s.toString().matches(pattern);
如果您需要将大量范围条件解析为
没有重叠的正则表达式类,则可以使用这样的实用程序。不确定您是要嵌入
实用程序代码还是仅嵌入字符类结果。
不幸的是,我不是 Java 专家。所以这个实用程序是用 Perl 编写的。也许你
可以把它转换成 Java 或者只是用它来生成一个类。
这是一个 ASCII 样本,它只需要一个很大的条件并针对连续的数字范围(在本例中为 0 - 255)进行测试,
根据字符代码生成一个字符串,然后将字符串操作为有效字符班级。
编辑:需要两个分隔符;$pad 和 $range,它们应该在条件中有效的范围之外。
祝你好运!
$class = '';
$valid = 0;
$pad = "\x{100}";
$range = "\x{101}";
for $s (0 .. 255)
{
if ( ($s >= 33 && $s <= 47)
|| ($s >= 58 && $s <= 64)
|| ($s >= 91 && $s <= 96)
|| ($s >= 123 && $s <= 140)
|| ($s > 4 && $s < 25)
|| ($s > 180)
|| ($s == 0)
)
{
$class .= chr($s);
$valid = 1;
# print $s,"\n";
}
else {
$class .= $pad;
}
}
if ( $valid)
{
# Escape special class characters
$class =~ s/([\[\]\-\^\\])/\\$1/g;
# Compact range, insert delimiter, then remove padding
$class =~ s/(\\?[^$pad])[^$pad]+(\\?[^$pad])/$1$range$2/g;
$class =~ s/[$pad]//g;
# Convert non-printable ASCII characters to hex (does not process delimeter)
$class = join '',
map { my $v = ord($_);
$v != ord($range) && ($v < 32 || ($v > 126 && $v < 256)) ?
sprintf("\\x%.2x", $v) : $_
} split (//, $class);
# Insert range operator's
$class =~ s/[$range]/-/g;
# Print class
$class = '[' . $class . ']';
print "\nEquivalent class = ", $class, "\n";
}
else {
print "\nNothing in range!\n";
}
输出 -
Equivalent class = [\x00\x05-\x18!-/:-@\[-`{-\x8c\xb5-\xff]