什么正则表达式用于从 wpa_supplicant.conf 获取网络对象?
What regex use to get network object from wpa_supplicant.conf?
我的文件结构如下:
ctrl_interface=/data/misc/wifi/sockets
driver_param=use_p2p_group_interface=1
update_config=1
device_name=P580_ROW
manufacturer=LENOVO
model_name=Lenovo
model_number=Lenov
serial_number=hjhjh7
device_type=10-0050F204-5
os_version=01020300
config_methods=physical_display virtual_push_button
p2p_no_group_iface=1
network={
ssid="test1"
psk="154695"
key_mgmt=WPA-PSK
sim_slot="-1"
imsi="none"
priority=1
}
network={
ssid="SSID2"
psk="test123456"
key_mgmt=WPA-PSK
sim_slot="-1"
imsi="none"
priority=19
}
我想问一下,如何使用正则表达式(模式和匹配器)或 [=21= 中的类似内容获取具有可访问属性的网络对象数组列表(但也可以是 JSON) ]?
我尝试使用该服务寻找解决方案
http://txt2re.com/
但是没有运气获得具有可访问属性的对象。
非常感谢您的任何建议。
这是一个工作示例。试试吧。
public class Test {
private static final String REGEXP = "network=\{\n\s*ssid=\"(?<ssid>.*)\"\n\s*psk=\"(?<psk>.*)\"\n\s*key_mgmt=(?<keymgmt>.*)\n\s*sim_slot=\"(?<simslot>.*)\"\n\s*imsi=\"(?<imsi>.*)\"\n\s*priority=(?<priority>.*)\n}";
private static final String DATA = "ctrl_interface=/data/misc/wifi/sockets\n" +
"driver_param=use_p2p_group_interface=1\n" +
"update_config=1\n" +
"device_name=P580_ROW\n" +
"manufacturer=LENOVO\n" +
"model_name=Lenovo \n" +
"model_number=Lenov\n" +
"serial_number=hjhjh7\n" +
"device_type=10-0050F204-5\n" +
"os_version=01020300\n" +
"config_methods=physical_display virtual_push_button\n" +
"p2p_no_group_iface=1\n" +
"\n" +
"network={\n" +
" ssid=\"test1\"\n" +
" psk=\"154695\"\n" +
" key_mgmt=WPA-PSK\n" +
" sim_slot=\"-1\"\n" +
" imsi=\"none\"\n" +
" priority=1\n" +
"}\n" +
"\n" +
"network={\n" +
" ssid=\"SSID2\"\n" +
" psk=\"test123456\"\n" +
" key_mgmt=WPA-PSK\n" +
" sim_slot=\"-1\"\n" +
" imsi=\"none\"\n" +
" priority=19\n" +
"}";
public static void main(String[] args){
final Pattern pattern = Pattern.compile(REGEXP);
final Matcher matcher = pattern.matcher(DATA);
while(matcher.find()){
System.out.println("New network");
System.out.println("-----------");
System.out.println("SSID: "+matcher.group("ssid"));
System.out.println("PSK: "+matcher.group("psk"));
System.out.println("KEY MGMT: "+matcher.group("keymgmt"));
System.out.println("SIM SLOT: "+matcher.group("simslot"));
System.out.println("IMSI: "+matcher.group("imsi"));
System.out.println("PRIORITY: "+matcher.group("priority"));
}
}
}
我的 RegExp 效率不高。我认为这种方法很脏,还有比这更好的解决方案。(WorkSpace: https://regex101.com/r/nA8fD1/1)
如果您不知道属性的名称及其数量,可以使用基于 \G
运算符的正则表达式:
String str = "<<YOUR_STRING>>";
Pattern ptrn = Pattern.compile("(?<new>network=\{|(?!^)\G)\s*(?<key>\w+)=\"?(?<value>[^\"\n]+)\"?");
Matcher matcher = ptrn.matcher(str);
int count = 1;
while (matcher.find()) {
if (matcher.group("new") != null && matcher.group("new").length() > 0) {
System.out.println("New Network: " + count);
count += 1;
}
System.out.println(matcher.group("key") + ":\"" + matcher.group("value").trim() + "\"");
}
正则表达式 - (?<new>network=\{|(?!^)\G)\s*(?<key>\w+)="?(?<value>[^"\n]+)"?
- 匹配:
(?<new>network=\{|(?!^)\G)
- network={
或上一次成功匹配结束(组"new")
\s*
- 可选空格
(?<key>\w+)
- 1 个或多个字母数字符号("key" 组)
="?
- 文字 =
和可选的 "
(?<value>[^"\n]+)
- 除了 "
和换行符之外的 1 个或多个字符(组 "value")
"?
- 一个可选的 "
我的文件结构如下:
ctrl_interface=/data/misc/wifi/sockets
driver_param=use_p2p_group_interface=1
update_config=1
device_name=P580_ROW
manufacturer=LENOVO
model_name=Lenovo
model_number=Lenov
serial_number=hjhjh7
device_type=10-0050F204-5
os_version=01020300
config_methods=physical_display virtual_push_button
p2p_no_group_iface=1
network={
ssid="test1"
psk="154695"
key_mgmt=WPA-PSK
sim_slot="-1"
imsi="none"
priority=1
}
network={
ssid="SSID2"
psk="test123456"
key_mgmt=WPA-PSK
sim_slot="-1"
imsi="none"
priority=19
}
我想问一下,如何使用正则表达式(模式和匹配器)或 [=21= 中的类似内容获取具有可访问属性的网络对象数组列表(但也可以是 JSON) ]?
我尝试使用该服务寻找解决方案 http://txt2re.com/ 但是没有运气获得具有可访问属性的对象。
非常感谢您的任何建议。
这是一个工作示例。试试吧。
public class Test {
private static final String REGEXP = "network=\{\n\s*ssid=\"(?<ssid>.*)\"\n\s*psk=\"(?<psk>.*)\"\n\s*key_mgmt=(?<keymgmt>.*)\n\s*sim_slot=\"(?<simslot>.*)\"\n\s*imsi=\"(?<imsi>.*)\"\n\s*priority=(?<priority>.*)\n}";
private static final String DATA = "ctrl_interface=/data/misc/wifi/sockets\n" +
"driver_param=use_p2p_group_interface=1\n" +
"update_config=1\n" +
"device_name=P580_ROW\n" +
"manufacturer=LENOVO\n" +
"model_name=Lenovo \n" +
"model_number=Lenov\n" +
"serial_number=hjhjh7\n" +
"device_type=10-0050F204-5\n" +
"os_version=01020300\n" +
"config_methods=physical_display virtual_push_button\n" +
"p2p_no_group_iface=1\n" +
"\n" +
"network={\n" +
" ssid=\"test1\"\n" +
" psk=\"154695\"\n" +
" key_mgmt=WPA-PSK\n" +
" sim_slot=\"-1\"\n" +
" imsi=\"none\"\n" +
" priority=1\n" +
"}\n" +
"\n" +
"network={\n" +
" ssid=\"SSID2\"\n" +
" psk=\"test123456\"\n" +
" key_mgmt=WPA-PSK\n" +
" sim_slot=\"-1\"\n" +
" imsi=\"none\"\n" +
" priority=19\n" +
"}";
public static void main(String[] args){
final Pattern pattern = Pattern.compile(REGEXP);
final Matcher matcher = pattern.matcher(DATA);
while(matcher.find()){
System.out.println("New network");
System.out.println("-----------");
System.out.println("SSID: "+matcher.group("ssid"));
System.out.println("PSK: "+matcher.group("psk"));
System.out.println("KEY MGMT: "+matcher.group("keymgmt"));
System.out.println("SIM SLOT: "+matcher.group("simslot"));
System.out.println("IMSI: "+matcher.group("imsi"));
System.out.println("PRIORITY: "+matcher.group("priority"));
}
}
}
我的 RegExp 效率不高。我认为这种方法很脏,还有比这更好的解决方案。(WorkSpace: https://regex101.com/r/nA8fD1/1)
如果您不知道属性的名称及其数量,可以使用基于 \G
运算符的正则表达式:
String str = "<<YOUR_STRING>>";
Pattern ptrn = Pattern.compile("(?<new>network=\{|(?!^)\G)\s*(?<key>\w+)=\"?(?<value>[^\"\n]+)\"?");
Matcher matcher = ptrn.matcher(str);
int count = 1;
while (matcher.find()) {
if (matcher.group("new") != null && matcher.group("new").length() > 0) {
System.out.println("New Network: " + count);
count += 1;
}
System.out.println(matcher.group("key") + ":\"" + matcher.group("value").trim() + "\"");
}
正则表达式 - (?<new>network=\{|(?!^)\G)\s*(?<key>\w+)="?(?<value>[^"\n]+)"?
- 匹配:
(?<new>network=\{|(?!^)\G)
-network={
或上一次成功匹配结束(组"new")\s*
- 可选空格(?<key>\w+)
- 1 个或多个字母数字符号("key" 组)="?
- 文字=
和可选的"
(?<value>[^"\n]+)
- 除了"
和换行符之外的 1 个或多个字符(组 "value")"?
- 一个可选的"