如何从需要相互比较的两个字符中检测到字母及其上/下案例格式?

发布于 01-24 16:33 字数 761 浏览 3 评论 0 原文

我需要得到:

  • 如果两个字符都不是字母,则返回-1,
  • 如果两个字符都是同一情况,则返回1,
  • 如果两个字符是字母,但不是同一情况,则返回0个

示例:

'a'和'g '返回1'a

'和'c'返回1'b

'和g'返回

0'b'和g'返回0'0'and

'?''返回-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', '?'));

请帮忙..

I need to get:

  • If either of the characters is not a letter, return -1
  • If both characters are the same case, return 1
  • If both characters are letters, but not the same case, return 0

Examples:

'a' and 'g' returns 1

'A' and 'C' returns 1

'b' and 'G' returns 0

'B' and 'g' returns 0

'0' and '?' returns -1

Now my code is uncorrect:

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', '?'));

Help, please..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

岁月静好 2025-01-31 16:33:41

您错误地使用了Regex。如果要检查字符是从a到z的字母,则应使用/[az]/

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', '?'));

You are using regex incorrectly. You should have used /[a-z]/ if you want to check that your character is a letter from a to 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', '?'));

贱贱哒 2025-01-31 16:33:41

您正在使用错误的语法进行正则表达式。

/az/匹配字符串 az 。如果要测试各种字符,则需要将范围包装在 [] 中。

另外,您的返回值与您描述的期望不符。

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', '?'));

You are using the wrong syntax for the regular expressions.

/a-z/ matches the string a-z. If you want to test for a range of characters, you need to wrap the range in [].

Also your return values didn't match the expectations you described.

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', '?'));

背叛残局 2025-01-31 16:33:41

+++作为附加信息+++

connexo 的方法上构建的方法,并将其变成解决方案,而不仅仅是覆盖的解决方案基本的拉丁语上层和下案字母,可以用<="" a="">对应物,此外,每个字符范围更大...

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

+++ Just as additional information +++

Building on top of connexo's approach and turning it into a solution which does not just cover the basic latin upper- and lower-case letters, one could replace each character class with its unicode property escapes counterpart which in addition covers each a much wider range of characters ...

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

你不是我要的菜∠ 2025-01-31 16:33:41

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

代码片段

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

说明

内联注释上面添加了上述片段。

Presented below is one possible way to achieve the desired objective.

Code Snippet

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

Explanation

Inline comments added to the snippet above.

婴鹅 2025-01-31 16:33:41

另一个可能有些简短的解决方案:

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("?", "?");

Another possible solution that is a bit terser:

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("?", "?");

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文