【问题标题】:How does one capture a measure (number and/or unit) and a measured matter and always assures the same measure format/pattern?如何捕获度量(数字和/或单位)和度量的事项并始终确保相同的度量格式/模式?
【发布时间】:2024-01-04 05:19:01
【问题描述】:

我只是想了解 javascript,因为我对它有点陌生,而且它是一种功能强大的语言。

我想知道如何重新排列字符串中的单词和数字,以便某些单词可以始终位于前面。所以在这种情况下,数字和测量值将始终位于值的前面。

例如来自输入的期望输出:

Function input: Wood Plank 1 cm
Function output: 1 cm Wood Plank

Function input: Lawn Mower 1
Function output: 1 Lawn Mower

Function input: Tape Measure
Function output: Tape Measure

我有这个我制作的正则表达式,但我需要知道如何应用它

const unitCapturingRegX = (/^(?<amount>¼|½|¾|\d+\/\d+|\d+)\s*(?<value>.*)$/);

我在下面得到了一些测量结果:

const measures = [
  "cm", "m", "kg", "kgs", "kilogram", "kilograms", "l", "liter" ,"tbs","meter", "inch",
];

这是我的输入值:

const inputVal = [
  'Tape 1/2 cm',
  '1kg cement',
  '3 l water',
  'carbon fibre ½ inch'
]

这是可能的事情吗,请有人帮助我!!!

【问题讨论】:

  • 将测量值添加到 reg exp
  • 嗨@epascarello,请告诉我最好的方法,这样我就可以像其他人一样从这个答案中学习。非常感谢!

标签: javascript regex replace capture-group


【解决方案1】:

将单位添加到正则表达式的末尾

var re = /(.*)\s(¼|½|¾|\d+\/\d+|\d+)\s?(cm|m|kg|kgs|kilogram|kilograms|l|liter|tbs|meter|inch)?$/;

const inputVal = [
  'Tape 1/2 cm',
  'cement 1kg',
  '1kg cement',
  '3 l water',
  'water 3 l',
  'carbon fibre ½ inch',
  'Lawn Mower 1'
]

const altered = inputVal.map(function(str) {
  return str.replace(re, "$2 $3 $1") // or "$2$3 $1"
})

console.log(altered);

并从数组中生成它

const measures = [
  "cm", "m", "kg", "kgs", "kilogram", "kilograms", "l", "liter" ,"tbs","meter", "inch",
];

var units = measures.join("|");
var re = new RegExp("(.*)\\s(¼|½|¾|\\d+\\/\\d+|\\d+)\\s?(" + units + ")?$");

const inputVal = [
  'Tape 1/2 cm',
  'cement 1kg',
  '1kg cement',
  '3 l water',
  'water 3 l',
  'carbon fibre ½ inch'
]

const altered = inputVal.map(function(str) {
  return str.replace(re, "$2 $3 $1") // or "$2$3 $1"
})

console.log(altered);

【讨论】:

  • 哦,我的天哪,非常感谢您,我将如何在正则表达式中包含数组值,而不是像 cm|m|kg|kgs| 这样添加它们,因为更多的测量值可能难以输入。有没有办法在正则表达式中包含实际的measures 数组,顺便说一句,非常感谢
  • 可以生成RegExp
  • 我对 Reg Ex 有基本的了解,所以我该怎么做才能让你更有才华我是 Javascript 新手
  • 哦,天哪,很抱歉再次打扰您,您的回答确实有帮助,但是当只有一个数字而没有像输入 Lawn Mower 1 这样的数量来输出 1 Lawn Mower 时,它就不起作用了
  • 我该怎么做?
【解决方案2】:

提供的方法基于此正则表达式(/^(?&lt;left&gt;[^¼½¾\d]+)*(?&lt;count&gt;¼|½|¾|\d+\/\d+|\d+)\s*(?&lt;unit&gt;kilograms|l|cm|m)*(?&lt;right&gt;.*)/)。那里有详细的描述。

正则表达式会考虑 measure 中的可选 matter/material &lt;left&gt; 和/或 &lt;right&gt;measure 再次由有效数字或分数-&lt;count&gt; 和可选的&lt;unit&gt; 组成。

任何字符串值都可以传递给清理函数,该函数使用其主要的replace 方法通过replacement function 重新排列capture groups。第二个replace 步骤也适用于与正则表达式不匹配的字符串值。

因此,通过所有这些步骤,无论输入数据的质量如何,都可以确保获得非常干净的结果...

const regXMeasureAndMatter = (/^(?<left>[^¼½¾\d]+)*(?<count>¼|½|¾|\d+\/\d+|\d+)\s*(?<unit>kilograms|kilogram|kgs|kg|liter|l|tbs|inch|meter|cm|m)*(?<right>.*)/);

function rearrangeMeasureAndMatter(match, left, count, unit, right) {
  left = (left || '' ).trim();
  right = (right || '' ).trim();
  return [
  
    count,
    (unit || ''),
    [left, right].join((left && right && ', ') || '')

  ].join(' ')
}
function sanitizeMeasureAndMatter(str) {
  return str
    .replace(regXMeasureAndMatter, rearrangeMeasureAndMatter)
    .replace(/\s+/g, ' ').trim()
}
console.log([

  '  left   22/33   kilogram   right  ',
  '     Tape Measure     ',
  '21m  Wood Plank',
  '  3l Wood   Plank  ',
  ' Wood  Plank  20/10  cm ',
  'Lawn Mower 2/2',
  'Tape   123   Measure',
  '  Wood Plank   ½    cm  ',
  'Lawn   Mower ¾  cm',
  '  Tape     Measure  ',
  '  safas 1/2  '

].map(sanitizeMeasureAndMatter));
.as-console-wrapper { min-height: 100%!important; top: 0; }

通过单元数组动态生成正则表达式的解决方案遵循上述方法,只是改变了正则表达式的创建方式...

const unitList = ['kilograms', 'kilogram', 'kgs', 'kg', 'liter', 'l', 'tbs', 'inch', 'meter', 'cm', 'm'];

const regXMeasureAndMatter = RegExp('^(?<left>[^¼½¾\\d]+)*(?<count>¼|½|¾|\\d+\\/\\d+|\\d+)\\s*(?<unit>' + unitList.join('|') + ')*(?<right>.*)');

function rearrangeMeasureAndMatter(match, left, count, unit, right) {
  left = (left || '' ).trim();
  right = (right || '' ).trim();
  return [
  
    count,
    (unit || ''),
    [left, right].join((left && right && ', ') || '')

  ].join(' ')
}
function sanitizeMeasureAndMatter(str) {
  return str
    .replace(regXMeasureAndMatter, rearrangeMeasureAndMatter)
    .replace(/\s+/g, ' ').trim()
}
console.log([

  '  left   22/33   kilogram   right  ',
  '     Tape Measure     ',
  '21m  Wood Plank',
  '  3l Wood   Plank  ',
  ' Wood  Plank  20/10  cm ',
  'Lawn Mower 2/2',
  'Tape   123   Measure',
  '  Wood Plank   ½    cm  ',
  'Lawn   Mower ¾  cm',
  '  Tape     Measure  ',
  '  safas 1/2  '

].map(sanitizeMeasureAndMatter));
.as-console-wrapper { min-height: 100%!important; top: 0; }

【讨论】:

    最近更新 更多