regex 如何在字符串的第一个字母之前和之后拆分字符串

gcmastyq  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(114)

我需要从一个包含数字、字母和特殊字符的字符串中获取单独的数字+特殊字符+字母。我的尝试

var chars = str.slice(0, str.search(/[a-zA-Z]+/));
var numbs = str.replace(chars, '');

字符串
如果没有字母,代码就不起作用。
它应该如何工作的例子

'123.331abc' -> '123.331' + 'abc'
'12331abc123' -> '12331' + 'abc123'

fivyi3re

fivyi3re1#

你可以用正则表达式得到这两个部分:

const arr = [
  '123',
  '123.331',
  '123.331abc',
  '12331abc123'
];

const splitBeforeLetter = str => str.match(/([^A-Za-z]+)(.*)/).slice(1);

console.log(...arr.map(splitBeforeLetter));

字符串

vaj7vani

vaj7vani2#

const test = "123.887azee7";
const firstLetterIndex = test.search(/[a-zA-Z]/); // return the index of the first letter found, "-1" otherwise

字符串
那么你就用String.prototype.substring()

if (firstLetterIndex !== -1) {
    const firstSubstring = test.substring(0, firstLetterIndex); //  out put 123.887
    const secondSubstring = test.substring(firstLetterIndex); // output azee7
} else {
    console.log('no letters founed');
    // or do whatever you want
}

2nc8po8w

2nc8po8w3#

匹配第一部分,然后.slice()得到第二部分:

const [firstPart] = string.match(/^[^a-z]*/i);
const secondPart = string.slice(firstPart.length);

字符串
^[^a-z]*表示开头有0个或多个非字母。由于*量词的性质,这将始终匹配,从而导致第一个元素是第一部分的匹配数组。
试试看:

console.config({ maximize: true });

const testcases = [
    '12331abc123',
    '123.331abc',
    'abc123',
    'abc',
    '123',
];

function splitBeforeFirstLetter(string) {
  const [firstPart] = string.match(/^[^a-z]*/i);
  const secondPart = string.slice(firstPart.length);
  
  return [firstPart, secondPart];
}

testcases.forEach(
  testcase => console.log(testcase, splitBeforeFirstLetter(testcase))
);
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

的数据

相关问题