如何从两个需要相互比较的字符中检测字母及其大小写格式?



我需要得到:

  • 如果其中一个字符不是字母,返回-1
  • 如果两个字符相同,返回1
  • 如果两个字符都是字母,但大小写不同,则返回0

例子:

'a'和'g'返回1

'A'和'C'返回1

'b'和'G'返回0

'B'和'g'返回0

'0'和'?'返回-1

现在我的代码是不正确的:

function sameCase(a, b) {
if (a.match(/a-z/) && b.match(/a-z/)) {
return 1;
}
if (a.match(/A-Z/) && b.match(/A-Z/)) {
return 0;
}
if (b.match(/a-z/) && a.match(/A-Z/)) {
return 0;
}
return -1;
}
console.log(sameCase('a', 'b'));
console.log(sameCase('A', 'B'));
console.log(sameCase('a', 'B'));
console.log(sameCase('B', 'g'));
console.log(sameCase('0', '?'));

帮助,请. .

您正在错误地使用正则表达式。如果你想检查你的字符是从a到z的字母,你应该使用/[a-z]/

function sameCase(a, b){
if (a.match(/[a-z]/) && b.match(/[a-z]/)) {
return 1;
}
if (a.match(/[A-Z]/) && b.match(/[A-Z]/)) {
return 1;
}
if (b.match(/[a-z]/) && a.match(/[A-Z]/)) {
return 0;
}
if (a.match(/[a-z]/) && b.match(/[A-Z]/)) {
return 0;
}
return -1;
}
console.log(sameCase('a', 'b'));
console.log(sameCase('A', 'B'));
console.log(sameCase('a', 'B'));
console.log(sameCase('B', 'g'));
console.log(sameCase('0', '?'));

您使用了错误的正则表达式语法。

/a-z/匹配字符串a-z。如果您想测试一个字符范围,您需要在[]中包装该范围。

你的返回值也不符合你所描述的期望。

function sameCase(a, b) {
if (
(a.match(/[a-z]/) && b.match(/[a-z]/)) ||
(a.match(/[A-Z]/) && b.match(/[A-Z]/))
) {
return 1;
}
if (
(b.match(/[a-z]/) && a.match(/[A-Z]/)) ||
(b.match(/[A-Z]/) && a.match(/[a-z]/))  
) {
return 0;
}
return -1;
}
console.log(sameCase('a', 'b'));
console.log(sameCase('A', 'B'));
console.log(sameCase('a', 'B'));
console.log(sameCase('B', 'g'));
console.log(sameCase('0', '?'));

+++ +++ +++

建筑在connexo的方法,并把它变成一个解决方案,它不仅涵盖基本的拉丁大写和小写字母,一个人可以用它的unicode属性转义对应物来替换每个字符类,它还涵盖了更广泛的字符…

// based on basic latin letter character classes.
function sameCaseBasicLatin(a, b) {
if (
(a.match(/[a-z]/) && b.match(/[a-z]/)) ||
(a.match(/[A-Z]/) && b.match(/[A-Z]/))
) {
return 1;
}
if (
(b.match(/[a-z]/) && a.match(/[A-Z]/)) ||
(b.match(/[A-Z]/) && a.match(/[a-z]/))  
) {
return 0;
}
return -1;
}
// ... ok ...
console.log('`sameCaseBasicLatin` invoked with basic latin letters');
console.log(sameCaseBasicLatin('a', 'b'));
console.log(sameCaseBasicLatin('A', 'B'));
console.log(sameCaseBasicLatin('a', 'B'));
console.log(sameCaseBasicLatin('B', 'g'));
console.log(sameCaseBasicLatin('0', '?'));
// ... but ... not ok.
console.log('`sameCaseBasicLatin` invoked with diacritic latin letters');
console.log(sameCaseBasicLatin('â', 'ê'));
console.log(sameCaseBasicLatin('Â', 'Ê'));
console.log(sameCaseBasicLatin('â', 'Î'));
console.log(sameCaseBasicLatin('Ô', 'ä'));
console.log(sameCaseBasicLatin('-', '#'));

// make use of unicode property escapes.
function sameCaseLetters(a, b) {
// lowercase letter as unicode property escape.
const regXLowerCaseLetter = (/p{Ll}/u);
// uppercase letter as unicode property escape.
const regXUpperCaseLetter = (/p{Lu}/u);
if (
(regXLowerCaseLetter.test(a) && regXLowerCaseLetter.test(b)) ||
(regXUpperCaseLetter.test(a) && regXUpperCaseLetter.test(b))
) {
return 1;
}
if (
(regXLowerCaseLetter.test(a) && regXUpperCaseLetter.test(b)) ||
(regXUpperCaseLetter.test(a) && regXLowerCaseLetter.test(b))  
) {
return 0;
}
return -1;
}
// ... ok ...
console.log('`sameCaseLetters` invoked with basic latin letters');
console.log(sameCaseLetters('a', 'b'));
console.log(sameCaseLetters('A', 'B'));
console.log(sameCaseLetters('a', 'B'));
console.log(sameCaseLetters('B', 'g'));
console.log(sameCaseLetters('0', '?'));
// ... and ... also ok.
console.log('`sameCaseLetters` invoked with diacritic latin letters');
console.log(sameCaseLetters('â', 'ê'));
console.log(sameCaseLetters('Â', 'Ê'));
console.log(sameCaseLetters('â', 'Î'));
console.log(sameCaseLetters('Ô', 'ä'));
console.log(sameCaseLetters('-', '#'));
.as-console-wrapper { min-height: 100%!important; top: 0; }

下面是实现预期目标的一种可能方法。

<<p>

代码片段/strong>

// helper methods to determin lower, upper cases
const isLower = x => x === x.toLowerCase();
const isUpper = x => x === x.toUpperCase();
const sameCase = (a, b) => {
// if either "a" or "b" are not "letter"s, return -1
if (!a.match(/[a-z|A-Z]/) || !b.match(/[a-z|A-Z]/)) return -1;
// if both "a" and "b" are either lower or upper case, return 1
if ((isLower(a) && isLower(b)) || (isUpper(a) && isUpper(b))) return 1;

// return 0 (since "a", "b" are letters, but not same case)
return 0;
};
console.log("sameCase('a', 'b'): ", sameCase('a', 'b'));
console.log("sameCase('A', 'B'): ", sameCase('A', 'B'));
console.log("sameCase('a', 'B'): ", sameCase('a', 'B'));
console.log("sameCase('B', 'g'): ", sameCase('B', 'g'));
console.log("sameCase('0', '?'): ", sameCase('0', '?'));
.as-console-wrapper { max-height: 100% !important; top: 0 }

在上面的代码片段中添加内联注释。

另一个可能更简洁的解决方案:

function sameCase(a, b) {
const both = a + b;
if (/[^a-z]/i.test(both)) return -1;
if (/^(?:[a-z]{2}|[A-Z]{2})$/.test(both)) return 1;
return 0;
}
function test(a, b) {
console.log(a, b, sameCase(a,b));
}
test("A", "B");
test("a", "b");
test("A", "b");
test("a", "B");
test("?", "b");
test("a", "?");
test("?", "?");

最新更新