如何捕获度量数量和/或单位和度量物质,并始终确保相同的度量格式/样式?

问题描述

我只是想了解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'
]

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

解决方法

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

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','carbon fibre ½ inch'
]

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

console.log(altered);

,

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

正则表达式考虑了 measure 中的可选 matter / material <left>和/或<right>度量再次由有效的数字或分数<count>和可选的<unit>组成。

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

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

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,'  safas 1/2  '

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...