问题描述
我只是想了解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 function。 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,' safas 1/2 '
].map(sanitizeMeasureAndMatter));
.as-console-wrapper { min-height: 100%!important; top: 0; }