Tách dãy số từ chuỗi

Bài viết này sẽ giúp các bạn tách dãy số từ chuỗi. Ví dụ với chuỗi

"-1.223 %^& fsf 0.234 56.65 fsf 9 f"

Chúng ta sẽ tách được ra các số:

-1.223
0.234
56.65
9

How to extract numbers from string

Ở đây mình thực hiện thành công trên c và java, các ngôn ngữ khác chắc cũng có cách ;). Nói thêm là cách làm có sử dụng đến regex, bạn nào chưa rõ có thể đọc thêm về nó.

Trong C: thực chất cách này là mình tham khảo và phát triển từ bài How to extract numbers from string in c

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	// khong doc duoc str khi bat dau bang dau tru (-)
	char* str= "-1.223 %^& fsf 0.234 56.65 fsf 9 f";

	// khai bao, cap phat bo nho them s de cong them vao dau 1 ky tu
	char* const s = (char*)malloc(sizeof(strlen(str))+1);

	// cong them ky tu a
	strcpy(s, "a");
	strcpy(s + strlen(s), str);
	printf("%s\n",s);

	// tach lay cac so
	int total_n = 0; 
	int n;	
	float i; // cac so can tach

	printf("\nday cac so\n");
	while (1 == sscanf(s + total_n, "%*[^0123456789-]%f%n", &i, &n))
	{
		total_n += n;
		printf("%f\n", i);
	}

	return 0;
}

Trong Java: Cách dễ dàng nhất là biến tẩt cả ký tự không phải số (ngoại trừ dấu âm, dấu chấm) rồi tách thành các phần tử như dưới đây:

public class ScanArrayNumFromString {
	public static void main(String[] args) {

		// chuoi ban dau
		String str = "-1.223 %^& fsf 0.234 56.65 fsf 9 f";

		/**
		 * thay the toan bo nhung ky tu khong phai so, khong phai dau am, khong
		 * phai dau cham bang dau phay
		 */
		str = str.replaceAll("[^0-9,-\\.]", ",");

		/** cat thanh cac phan tu thong qua dau phay */
		String[] item = str.split(",");

		// duyet cac phan tu, neu la so thi in ra
		for (int i = 0; i < item.length; i++) {
			try {
				Double.parseDouble(item[i]);
				System.out.println(item[i]);
			} catch (NumberFormatException e) {
			}
		}

	}
}

Bài viết được thực hiện khi một bạn nào đó tối nay nhờ mình sửa bài về cái này trong c, tìm mãi mới thấy cách dùng.