Javascript 解析句子并提取转换值
我有一组给出转换率的句子,比如Javascript 解析句子并提取转换值,javascript,php,regex,parsing,string-parsing,Javascript,Php,Regex,Parsing,String Parsing,我有一组给出转换率的句子,比如 一万块钱∫一, ∫1个用于10k SMTH 1200美元∫0.1 以3英镑的价格出售3000英镑∫ 所有这些句子都显示了虚拟货币某物(SMTH)与虚拟货币单位的比率∫ (整体)。我需要一些方法来提取这两个单位之间的换算率。困难在于数字的格式可能不同(10000或10000或10k),单位的书写可能不同(某物、SMTH和不同的大写字母),单位的顺序也不同(“x SMTH代表x SMTH”)∫x“或”∫x代表x SMTH”),有时单位写为∫x或x∫. TL;DR:
- 一万块钱∫一,
- ∫1个用于10k SMTH
- 1200美元∫0.1
- 以3英镑的价格出售3000英镑∫李>
var val = get sentence,
integral,
something;
val = val.replace(",", "").replace("k ", "000 ").replace("m ", "000000 ").replace("million ", "000000 ").replace(" million ", "000000 ").replace(" something", "SMTH").replace(" smth", "SMTH");
words = val.split(" ");
for (var i = 0; i < words.length; i++) {
if (words[i].indexOf("$")!==-1) {
integral = words[i].replace("∫" , "");
} else if (words[i].indexOf("SMTH")!==-1) {
something = words[i].replace("SMTH" , "");
}
}
var val=get语句,
完整的
某物
val=val.replace(“,”,”)。replace(“k”,“000”)。replace(“m”,“000000”)。replace(“百万”,“000000”)。replace(“百万”,“000000”)。replace(“某物”,“SMTH”)。replace(“SMTH”,“SMTH”);
words=val.split(“”);
for(var i=0;i
简化的javascript/伪代码所有示例都使用“for”分隔转换。因此没有那么多的组合。您可以做的是有一个单词列表来标识每种货币,一个匹配数字的正则表达式,然后将左侧和右侧用“for”分隔。 要处理每个短语,请执行以下伪代码:
for each word:
if it's a known currency identifier
Store what is the currency
else if it's a number
Store the value
else if it's the "for" word
Change side
end if
end for
完成此循环后,您将拥有一个数据结构,其中包含每边的货币和金额。我尝试按照这些思路实现一些东西。正如其他人所提到的,
[currency]中有一个明确的模式用于[currency]
您可以很容易地匹配它。请看下面,它的文档记录相当完整
/**
* Parse an amount with currency "[symbol (optional)][amount][postfix (optional)] [currency (optional)]"
* @param {String} str Currency string e.g. "$100k dollars", "$100million", "100billion euro"
* @return {Array} See below
*/
function parseCurrency(str) {
var match = /([^0-9\.]+)?([0-9\.]+)(\w+)?(?:\s+(\w+))?/.exec(str);
if(!match) throw new Error("Bad currency input: " + str);
var symbol = match[1], // €, $, £
amount = match[2], // 100, 200
factor = match[3], // k, million i.e. 100k, 100million
unit = match[4] // euro, pound
return [symbol, amount, factor, unit];
}
/**
* Takes in a rate in the form of "[currency] for [currency]"
* @param {String} str "[currency] for [currency]"
* @return {Float} Rate float
*/
function parseRate(str) {
// Split and parse the currencies
var currencies = str.split("for").map(function(amount) {
return parseCurrency(amount.trim());
});
// Calculate the rate
// put the "for [currency]" over the "[currency] for"
var base = expandPostfix(currencies[0][1], currencies[0][2]),
exchangeTo = expandPostfix(currencies[1][1], currencies[1][2]);
return base / exchangeTo;
}
/**
* Expand a number postfix
* @param {Number} num
* @param {String} postfix Postfix such as "k", "m", "billion"
* @return {Number} Expanded number
*/
function expandPostfix(num, postfix) {
return num * (({
k : 1000,
m: 1000000,
million: 1000000
})[postfix] || 1);
}
parseRate("1 euro for 3 pound"); // 0.333
parseRate("10000 something for ∫1"); // 10000
parseRate("1200 Something for ∫0.1"); // 12000
这真的是一个有词结构的句子。有些东西是为了钱。有些东西是为了钱。翻译这句话似乎有很多障碍。我试着用一个关键字替换每一个提到一种货币的地方,以统一提到的货币,然后试着将不同的数字格式化为“real”“数字。这使它更简洁,但你仍然需要整理所有的填充词,如“for”或“selling”:(这帮了大忙,我没有完全使用你所做的,但我稍微改变了你的方法并编辑了我的问题。谢谢!