通过特殊字符从字符串中查找并提取序列

时间:2019-02-22 08:09:34

标签: javascript

我有一个包含文本内电话号码的字符串。该电话号码由特殊字符包裹。

示例特殊字符是'

  

你好'12345'世界

     

Hello World'12345'

     

'12345'Hello World

我要处理字符串和具有两个属性的对象,即电话号码和消息文本。

示例结果将是

{
   phonenumber: "12345",
   announcement: "Hello World"
}

我试图为此创建解决方案

const identificationCharacter = "'";

const exampleText = "Hello '12345' World";

const phoneInfo = inspect(exampleText);

console.log(phoneInfo);

function inspect(text) {
  const firstIndex = text.indexOf(identificationCharacter);
  const secondIndex = text.lastIndexOf(identificationCharacter) + 1;

  const phoneString = text.substring(firstIndex, secondIndex);

  const phoneNumber = phoneString.substring(1, phoneString.length - 1);

  const announcement = text.replace(phoneString, "");

  return {
    phoneNumber,
    announcement
  }
}

但我认为这不是一个好的解决方案。有更好的方法吗?

5 个答案:

答案 0 :(得分:3)

您也可以在.split旁加上',然后将最后一部分和第一部分相加:

 const [first, phoneNumber, last] = exampleText.split("'").map(it => it.trim());
 return {
   phoneNumber,
   anouncement: first + " " + last,
 };

答案 1 :(得分:2)

您可以使用正则表达式,将左右部分作为announcement,将中间部分作为phonenumber

console.log(["Hello '12345' World", "'Hello World '12345'", "'12345' Hello World"].map(s => { 
    var [, left, phonenumber, right] = s.match(/^(.*)'(.+)'(.*)$/).map(s => s.trim());
    return { phonenumber, announcement: (left + ' ' + right).trim() };
}));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

一种方法是使用替换和映射

let str = `Hello '12345' World
    Hello World '12345'
    '12345' Hello World`

let op = []

let rep = str.replace(/'(\d+)'/gm, function(match,g1){
  op.push(g1)
  return '';
})

let final = rep.split('\n').map((e,index)=>({
  accountNumber: op[index],
  accountName: e.trim()
}))

console.log(final)

答案 3 :(得分:1)

尝试使用正则表达式:可能是您可以在匹配后修剪组值,但是该方法有效...

var regex = /(.*)'(.*)'(.*)/
var input0 = "Hello '12345' World"
var result0 = input0.replace(regex, "{ phonenumber: \"$2\", announcement: \"$1$3\" }")
console.log(result0)


var input1 = "Hello World '12345'"
var result1 = input1.replace(regex, "{ phonenumber: \"$2\", announcement: \"$1$3\" }")
console.log(result1)

var input2 = "'12345' Hello World"
var result2 = input2.replace(regex, "{ phonenumber: \"$2\", announcement: \"$1$3\" }")
console.log(result2)

编辑

EXPLANATION

var regex = /(.*)'(.*)'(.*)/

  1. /.../定义一个正则表达式
  2. .*表示一个字符串,该字符串可以是任意字符,并且可以是任意长度
  3. (expr)匹配expr并使匹配的值可作为$i访问(其中i(...)的从1开始的索引,顺序为服饰
  4. "a string".replace(aRegex, "a replacement")尝试将aRegex"a string"进行匹配,将匹配项替换为"a replacement",其中可以包含$1$2,...

答案 4 :(得分:1)

在回应评论时,我尝试概括我以前的答案:

function convert(input, separator = "'") {
   var regex = new RegExp(`(.*)[${separator}](.*)[${separator}](.*)`)
   return input.replace(regex, "{ phonenumber: \"$2\", announcement: \"$1$3\" }")
}

console.log(convert("Hello '12345' World"))
console.log(convert("Hello +12345+ World", '+'))