如何从赛普拉斯的字符串中删除空格
How to remove whitespace from a string in Cypress
我正在尝试从表示金钱的数值中删除空格。
例如,我希望 1 000 kr
为 1000
。这与货币为 10 000
时的情况相同
我正在使用此函数删除 kr
,但是当我尝试添加另一个 .replace
时它不起作用:
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.invoke('text') // get text
.then((text) => +text.replace('kr', '').trim());
});
我如何添加另一个 .replace 以删除数值中的额外间距?
这应该有效:
function formatString(text) {
return text.replace('kr', '').replace('\u00A0','').trim();
}
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.invoke('text') // get text
.then(formatString)
});
但您也可以使用 Cypress 通过正则表达式字符串实现此目的(Cypress FAQ 中的第一个示例与您的示例类似):
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.should('have.text', '\d+[\u00A0]*')
});
您可以在此处测试正则表达式:https://regex101.com/r/YC4szy/1。它将匹配带有数字的字符串,后跟空白 space 和任何后续字符。你可以用正则表达式来测试你想要的东西。
我的最后一个建议是,如果匹配正则表达式模式没有帮助,您可以将 cypress 命令包装在一个函数中,该函数将文本内容作为参数,您将其传递到 should('have.text', ...)
行。
是非中断 space 与“常规”中断 space:
不同
const read = sel => document.querySelector(sel).textContent;
console.log(read('div') === '1 000 kr'); // false!
<div>1 000 kr</div>
这两个白色的space字符其实ascii码是不一样的:
const read = sel => document.querySelector(sel).textContent;
const strencode = str => [...str].map(c => c.charCodeAt(0)).join('\t');
console.log(strencode('1 000 kr'));
console.log(strencode(read('div')));
<div>1 000 kr</div>
看看第二个字符有何不同?
您可以使用 String#normalize
:
规范化字符串
const read = sel => document.querySelector(sel).textContent;
console.log(read('div').normalize('NFKC') === '1 000 kr')
<div>1 000 kr</div>
因此,这是您问题的一种可能答案:
- 标准化你的字符串
- 删除所有 spaces (ascii 32) 字符
/ /g
- 去掉最后的
'kr'
const read = sel => document.querySelector(sel).textContent;
const clean = str => str.normalize('NFKC').replace(/ /g, '').replace(/kr$/, '');
console.log(clean(read('#div1')));
console.log(clean(read('#div2')));
<div id="div1">1 000 kr</div>
<div id="div2">10 000</div>
请参阅How is a non-breaking space represented in a JavaScript string?
When doing .text(), all HTML entities are decoded to their character values.
Instead of comparing using the entity, compare using the actual raw character
if (x == '\xa0') { // Non-breakable space is char 0xa0 (160 dec)
这就是您要查找的表达式
+text.replace('kr', '')
.replace('\xa0', '')
.trim()
测试
<div>1 100 kr</div>
为了说明@evolutionxbox 的想法,您可以在 element.innerText
上使用正则表达式来替换不间断空格。
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.then($el => +$el[0].innerText.replace(/\s/g, '').replace('kr', '') )
})
我正在尝试从表示金钱的数值中删除空格。
例如,我希望 1 000 kr
为 1000
。这与货币为 10 000
我正在使用此函数删除 kr
,但是当我尝试添加另一个 .replace
时它不起作用:
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.invoke('text') // get text
.then((text) => +text.replace('kr', '').trim());
});
我如何添加另一个 .replace 以删除数值中的额外间距?
这应该有效:
function formatString(text) {
return text.replace('kr', '').replace('\u00A0','').trim();
}
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.invoke('text') // get text
.then(formatString)
});
但您也可以使用 Cypress 通过正则表达式字符串实现此目的(Cypress FAQ 中的第一个示例与您的示例类似):
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.should('have.text', '\d+[\u00A0]*')
});
您可以在此处测试正则表达式:https://regex101.com/r/YC4szy/1。它将匹配带有数字的字符串,后跟空白 space 和任何后续字符。你可以用正则表达式来测试你想要的东西。
我的最后一个建议是,如果匹配正则表达式模式没有帮助,您可以将 cypress 命令包装在一个函数中,该函数将文本内容作为参数,您将其传递到 should('have.text', ...)
行。
是非中断 space 与“常规”中断 space:
const read = sel => document.querySelector(sel).textContent;
console.log(read('div') === '1 000 kr'); // false!
<div>1 000 kr</div>
这两个白色的space字符其实ascii码是不一样的:
const read = sel => document.querySelector(sel).textContent;
const strencode = str => [...str].map(c => c.charCodeAt(0)).join('\t');
console.log(strencode('1 000 kr'));
console.log(strencode(read('div')));
<div>1 000 kr</div>
看看第二个字符有何不同?
您可以使用 String#normalize
:
const read = sel => document.querySelector(sel).textContent;
console.log(read('div').normalize('NFKC') === '1 000 kr')
<div>1 000 kr</div>
因此,这是您问题的一种可能答案:
- 标准化你的字符串
- 删除所有 spaces (ascii 32) 字符
/ /g
- 去掉最后的
'kr'
const read = sel => document.querySelector(sel).textContent;
const clean = str => str.normalize('NFKC').replace(/ /g, '').replace(/kr$/, '');
console.log(clean(read('#div1')));
console.log(clean(read('#div2')));
<div id="div1">1 000 kr</div>
<div id="div2">10 000</div>
请参阅How is a non-breaking space represented in a JavaScript string?
When doing .text(), all HTML entities are decoded to their character values.
Instead of comparing using the entity, compare using the actual raw character
if (x == '\xa0') { // Non-breakable space is char 0xa0 (160 dec)
这就是您要查找的表达式
+text.replace('kr', '')
.replace('\xa0', '')
.trim()
测试
<div>1 100 kr</div>
为了说明@evolutionxbox 的想法,您可以在 element.innerText
上使用正则表达式来替换不间断空格。
Cypress.Commands.add('currency', (selector) => {
cy.get(selector)
.children()
.eq(1)
.then($el => +$el[0].innerText.replace(/\s/g, '').replace('kr', '') )
})