WSO2字符串拆分求助:提取数字与非数字部分结果异常
WSO2 API 字符串拆分:分离数字与含空格非数字内容的解决方案
问题概述
在WSO2中搭建的字符串拆分API,目标是分离输入字符串中的数字与非数字部分,但当前实现存在两个问题:
- 数字结果带有多余换行和空格
- 非数字部分丢失空格(例如
Mario Naga变成MarioNaga)
问题原因
- 数字部分多余空白:原代码直接提取
<Value>节点内容,节点内的缩进换行被保留,未做空白处理 - 非数字丢失空格:原
translate函数仅保留大小写字母,未包含空格字符,导致空格被过滤
解决方案1:改进translate函数实现
通过调整空白处理和保留字符范围,修复两个问题:
<?xml version="1.0" encoding="UTF-8"?> <api context="/split1" name="SplitAlphaNumber" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST"> <inSequence> <!-- 用normalize-space()处理输入值,去除首尾空白并合并中间冗余空白 --> <property expression="normalize-space(//OperationValueRegex/Value)" name="Value" scope="default" type="STRING"/> <payloadFactory media-type="xml"> <format> <OperationValueRegex xmlns=""> <Result1>$1</Result1> <Result2>$2</Result2> </OperationValueRegex> </format> <args> <!-- 提取纯数字:移除所有非数字字符 --> <arg evaluator="xml" expression="translate($ctx:Value, translate($ctx:Value,'0123456789',''), '')"/> <!-- 提取非数字(含空格):移除所有数字,保留字母和空格 --> <arg evaluator="xml" expression="translate($ctx:Value, translate($ctx:Value,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ',''), '')"/> </args> </payloadFactory> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
修改点说明
- 在提取Value时添加
normalize-space(),处理输入中的换行、缩进等冗余空白 - 第二个
translate的保留字符末尾添加空格' ',确保非数字部分的空格被保留
解决方案2:使用正则表达式(更简洁)
WSO2支持XPath 2.0正则函数,用replace()可以更直观地实现拆分:
<?xml version="1.0" encoding="UTF-8"?> <api context="/split1" name="SplitAlphaNumber" xmlns="http://ws.apache.org/ns/synapse"> <resource methods="POST"> <inSequence> <property expression="normalize-space(//OperationValueRegex/Value)" name="Value" scope="default" type="STRING"/> <payloadFactory media-type="xml"> <format> <OperationValueRegex xmlns=""> <Result1>$1</Result1> <Result2>$2</Result2> </OperationValueRegex> </format> <args> <!-- 替换所有非数字字符为空,得到纯数字 --> <arg evaluator="xml" expression="replace($ctx:Value, '[^0-9]', '')"/> <!-- 替换所有数字字符为空,保留字母和空格 --> <arg evaluator="xml" expression="replace($ctx:Value, '[0-9]', '')"/> </args> </payloadFactory> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
正则说明
replace($ctx:Value, '[^0-9]', ''):匹配所有非数字字符并替换为空,提取纯数字replace($ctx:Value, '[0-9]', ''):匹配所有数字字符并替换为空,保留非数字内容(含空格)
测试结果
输入:
<OperationValueRegex> <Value>Mario Naga 1234</Value> </OperationValueRegex>
输出(符合预期):
<OperationValueRegex> <Result1>1234</Result1> <Result2>Mario Naga</Result2> </OperationValueRegex>
内容的提问来源于stack exchange,提问作者Hitoshi Mario Naga Mait
相关产品推荐
相关产品推荐

