在JavaScript中使用regexp从字符串中只获取带有“-”和“.”的数字

6yjfywim  于 7个月前  发布在  Java
关注(0)|答案(5)|浏览(96)

我需要用空('')替换不需要的字符串,使用regexp不像预期的那样工作。
如果我尝试替换开始组它的作品(^\w*) .但我不能选择的数字后修复. (\D*$) .如何合并两者或什么这是正确的语法来取代?
范例:

--123 should be -123
a-123 should be -123
!-123- should be -123
+-123.44x should be -123.44
--123.33- should be -123.33

字符串
当我尝试此操作时,没有得到预期的输出.replace(/[^-\d\.]\D*$/g, ""))

rlcwz9us

rlcwz9us1#

我的问题是:为什么使用replace()来删除你不想要的东西,而不是match()删除你想要的东西?

function getNumber(string) {
  const [match] = string.match(/-?\d+(\.\d+)?/) || [null];
  return match;
}

["--123", "a-123", "!-123", "!-123-", "+-123.44x", "--123.33-", "non-number"]
  .map(getNumber)
  .forEach(result => console.log(JSON.stringify(result)));

字符串
在上面的代码片段中,我们使用了正则表达式/-?\d+(\.\d+)?/,它匹配一个可选的-,后跟一个或多个小数。这些后面可以跟一个.,但前提是后面必须跟一个或多个其他小数。
如果没有匹配,则从match()返回null。为了防止在解构const [match] = ...时出现异常,我们改为分配[null]

zbq4xfa0

zbq4xfa02#

您可以使用以下正则表达式进行搜索:

^\D*(?:(?=-)|\D)|(?<=\d)(?!\.\d)[^\d\n].*$

字符串
并将其替换为空字符串。
Code Demo

产品代码:

const rx = /^\D*(?:(?=-)|\D)|(?<=\d)(?!\.\d)[^\d\n].*$/g;

['--123',
'a-123',
'-x123',
'ab123',
'!-123',
'+-123.44x',
'---a-x123.x45-abc',
'--123.33-'].forEach(
   el => console.log(el, ' => ', el.replace(rx, ''))
);

RegEx详情:

  • ^:开始
  • \D*:匹配0个或多个非数字
  • (?::启动非捕获组
  • (?=-):我们在下一个位置有一个-
  • |:或
  • \D:匹配任何非数字的字符
  • ):结束非捕获组
  • |:或
  • (?<=\d):Assert当前位置之前有一个数字
  • (?!\.\d):Assert前面没有点和数字
  • [^\d\n]:匹配一个不是数字也不是换行符的字符
  • .*:匹配任何内容
  • $:结束
44u64gxh

44u64gxh3#

写一个匹配你想保留的内容的正则表达式,在它的周围加上.*来匹配字符串的其余部分,然后只替换捕获的文本。

str = str.replace(/.*(-\d+(?:\.\d+)?).*/, "$1");

字符串
DEMO

fv2wmkja

fv2wmkja4#

  • ".如何合并两者或这是正确的语法来取代?."*

尝试以下 * 捕获模式 *。

/\S*?(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\S*/g

字符串

  • \S*? ... \S*,前面和后面可以有任何非 * 空白 * 字符。
  • (-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?),捕获任何数字,可选地后跟一个 * 十进制值 *,可选地后跟一个 * 科学计数法 * 中的值。

这里有一个例子。

var s = 
`--123 should be -123
a-123 should be -123
!-123- should be -123
+-123.44x should be -123.44
--123.33- should be -123.33`
var p = /\S*?(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\S*/g
s = s.replaceAll(p, '$1')

console.log(s)

ep6jt1vc

ep6jt1vc5#

你可以这样做:

function cleanString(str) {
  return str.replace(/^\w*|\D*$/g, '');
}

字符串

  • ^\w*:删除开头的所有单词字符。|:或
  • \D*$:删除结尾的所有非数字字符。
  • g:全局标志,替换所有示例。

相关问题